barcode

R 배워보기- 6.5. Manipulating data-Sequential data

Coding/R

내일 예고: 통계분석 들어가기 때문에 골치아파질 예정 
교수님 죄송합니다 여러번 외칠 예정 


이동평균 계산하기

이동평균: 전체 데이터 집합의 여러 하위 집합에 대한 일련의 평균을 만들어 데이터 요소를 분석하는 계산(솔직히 뭐 하는건지는 모르겠음) 

난 sequential data라길래 파이썬처럼 시퀀스형 데이터가 있나 했더니 연속형 데이터 말하는건가봄. 전구간에서 미분 가능한가요 NA 들어가면 짤없을 예정 

> set.seed(1)
> x=1:300
> y=sin(x)+rnorm(300,sd=1)
> y[295:300]=NA
> plot(x, y, type="l", col=grey(.5))

일단 뒤에 여백의 미를 줄 예정이다.

 

(마른세수)

 

> grid()

이게 모눈을 킨다고 다 이쁜 그래프가 아니그등요... 아무튼 계산해보자... 

 

> f20=rep(1/20,20)
> f20
 [1] 0.05 0.05 0.05 0.05 0.05 0.05 0.05 0.05 0.05 0.05 0.05 0.05 0.05 0.05 0.05
[16] 0.05 0.05 0.05 0.05 0.05
> y_lag=filter(y,f20,sides=1)
> lines(x,y_lag,col="red")

 

> f21=rep(1/21,21)
> f21
 [1] 0.04761905 0.04761905 0.04761905 0.04761905 0.04761905 0.04761905
 [7] 0.04761905 0.04761905 0.04761905 0.04761905 0.04761905 0.04761905
[13] 0.04761905 0.04761905 0.04761905 0.04761905 0.04761905 0.04761905
[19] 0.04761905 0.04761905 0.04761905
> y_sym=filter(y,f21,sides=2)
> lines(x,y_sym,col="blue")

솔직히 왜 20, 21인지는 모르겠다. 쿡북에 sin(x/20)으로 되어 있어서 그런가... 

아 참고로 

filter()는 결측값이 있으면 공백이 된다. 여백의 미 

 

블록으로 나눠서 평균 매기기

> set.seed(3)
> x=floor(runif(22)*100)
> x
 [1] 16 80 38 32 60 60 12 29 57 63 51 50 53 55 86 82 11 70 89 27 22  1

runif()=난수 생성, floor()=소수점 떼뿌라!!! 

 

# Round up the length of vector the to the nearest 4
> newlength=ceiling(length(x)/4)*4
> newlength
[1] 24

위에서 만든 벡터에서 네개씩 묶어서 평균 낸 결과라고 한다. (솔직히 귀찮아서 검산 안했음)

 

> x[newlength]=NA
> x
 [1] 16 80 38 32 60 60 12 29 57 63 51 50 53 55 86 82 11 70 89 27 22  1 NA NA

일단 길이를 늘리기 위해 벡터 두 개를 끼워넣고 

> x=matrix(x,nrow=4)
> x
     [,1] [,2] [,3] [,4] [,5] [,6]
[1,]   16   60   57   53   11   22
[2,]   80   60   63   55   70    1
[3,]   38   12   51   86   89   NA
[4,]   32   29   50   82   27   NA

이것이 행렬이다 희망편(아님)... 은 아니고 matrix()로 행렬 만들었다. 그러면 

> colMeans(x,na.rm=TRUE)
[1] 41.50 40.25 55.25 69.00 49.25 11.50
# 컬럼 평균
> rowMeans(x,na.rm=TRUE)
[1] 36.50000 54.83333 55.20000 44.00000
# 열 평균

아까랑 다른데? 

 

rle()

rle가 아마 run length encoding의 약자인듯. 자꾸 나와 이거... 

 

> v <- c("A","A","A", "B","B","B","B", NA,NA, "C","C", "B", "C","C","C")
> v
 [1] "A" "A" "A" "B" "B" "B" "B" NA  NA  "C" "C" "B" "C" "C" "C"

여기 벡터가 있다. 

> vr=rle(v)
> vr
Run Length Encoding
  lengths: int [1:7] 3 4 1 1 2 1 3
  values : chr [1:7] "A" "B" NA NA "C" "B" "C"

rle()를 줘 보면 NA가 각개로 나오는 것을 볼 수 있다. 얘는 python의 set과 달리 끊어져 있으면 중복으로 안 치는 듯 하다. (python set은 중복이면 가차없이 빼버림)

> inverse.rle(vr)
 [1] "A" "A" "A" "B" "B" "B" "B" NA  NA  "C" "C" "B" "C" "C" "C"

inverse.rle()를 쓰면 다시 벡터로 돌릴 수 있다. 

> str(w)
 chr [1:11] "Alpha" "Alpha" "pi" "pi" "pi" "Omicron" "Psi" "Psi" "Xi" "Xi" ...
> str(rle(w))
List of 2
 $ lengths: int [1:5] 2 3 1 2 3
 $ values : chr [1:5] "Alpha" "pi" "Omicron" "Psi" ...
 - attr(*, "class")= chr "rle"

확인해보면 타입이 다르다. (rle는 리스트 두 개)

 

> x=v
> x[is.na(x)]="D"
> x
 [1] "A" "A" "A" "B" "B" "B" "B" "D" "D" "C" "C" "B" "C" "C" "C"

NA를 다른 걸로 대체하게 되면 

> xr=rle(x)
> xr
Run Length Encoding
  lengths: int [1:6] 3 4 2 2 1 3
  values : chr [1:6] "A" "B" "D" "C" "B" "C"

rle() 결과가 달라진다. NA가 다 D로 바뀌었기 때문. 

> xr$values[xr$values=="D"]=NA
> xr
Run Length Encoding
  lengths: int [1:6] 3 4 2 2 1 3
  values : chr [1:6] "A" "B" NA "C" "B" "C"

그 상태에서 D를 NA로 바꾼 것은 원래 벡터를 그냥 rle() 한 것과 또 다르다. 

> x2=inverse.rle(xr)
> x2
 [1] "A" "A" "A" "B" "B" "B" "B" NA  NA  "C" "C" "B" "C" "C" "C"
# 중간에 NA를 때웠던 벡터
> inverse.rle(vr)
 [1] "A" "A" "A" "B" "B" "B" "B" NA  NA  "C" "C" "B" "C" "C" "C"
# NA 안 때운 벡터

근데 벡터되면 다 똑같음. 

이거 팩터에서도 되긴 되는데... 

> f=factor(v)
> f
 [1] A    A    A    B    B    B    B    <NA> <NA> C    C    B    C    C    C   
Levels: A B C

여기 팩터가 있다. 

> f_levels=levels(f)
> f_levels
[1] "A" "B" "C"

팩터의 레벨에 결측값은 낄 수 없다. ???: 뭐어? 결측값? 결측값??? 결측값도 레벨에 끼면 소는 누가 키울거야 소는! 결측값이랑 소랑 뭔 상관이여 

> fc=as.character(f)
> fc
 [1] "A" "A" "A" "B" "B" "B" "B" NA  NA  "C" "C" "B" "C" "C" "C"

아무튼 얘는 글자로 변환하고 rle()를 준다. 사실상 이 뒤로는 벡터랑 같은 부분이라 생략. 

근데 팩터에 rle 주면 안되냐고? 

> rle(f)
Error in rle(f) : 'x'는 반드시 atomic 타입으로 이루어진 벡터이어야 합니다

오류남. 

 

바로 앞 데이터로 NA 채우기 

> x <- c(NA,NA, "A","A", "B","B","B", NA,NA, "C", NA,NA,NA, "A","A","B", NA,NA)
> x
 [1] NA  NA  "A" "A" "B" "B" "B" NA  NA  "C" NA  NA  NA  "A" "A" "B" NA  NA

여기 벡터가 있다. (마른세수)

> goodIdx=is.na(x)
> goodIdx
 [1]  TRUE  TRUE FALSE FALSE FALSE FALSE FALSE  TRUE  TRUE FALSE  TRUE  TRUE
[13]  TRUE FALSE FALSE FALSE  TRUE  TRUE

와씨 더럽게 많네... 

> goodVals <- c(NA, x[goodIdx])
> goodVals
 [1] NA  "A" "A" "B" "B" "B" "C" "A" "A" "B"
# These are the non-NA values from x only
# Add a leading NA for later use when we index into this vector

NA 직전 값들을 알아낸다. (NA 앞 인덱스이면서 is.na()가 false인 값)

> fillIdx=cumsum(goodIdx)+1
> fillIdx
 [1]  1  1  2  3  4  5  6  6  6  7  7  7  7  8  9 10 10 10
# 1을 더하는 이유는 0부터 채우는 걸 피하기 위함이다!

그리고 채우기 위한 준비를 해 봅니다. 

> goodVals[fillIdx]
 [1] NA  NA  "A" "A" "B" "B" "B" "B" "B" "C" "C" "C" "C" "A" "A" "B" "B" "B"
# The original vector with gaps filled

는 맨 앞에 두 개 빼고 때웠음.