통계R DataFrame
많이 활용되는 DataFrame의 조작 방법을 알아본다.
Data frame 그룹별 처리
-
aggregate() 함수 적용
- 함수를 적용할 변수 설정 (x=), 그룹 변수 설정 (by=) 반드시 리스트이어야 함, 평균과 같은 함수 설정 (FUN=)
# 2,3,5,7 컬럼을 by에 그룹별로 평균값 산출 > aggregate(x=df[, c(2,3,5,7)], by=list(df$Vegetation), FUN=mean)
-
dplyr (디플라이어) 패키지를 이용한 방법
# dplyr 패키지에서 %>% 를 chain operator 또는 pipe operator 라고 부름. # dataframe %>% group_by() %>% select() %>% summarize() %>% filter() > df %>% group_by(Vegetation) %>% summarize(AreaM=mean(Area), SlopeM=mean(Slope), Soil.pHM=mean(Soil.pH), df.densityM=mean(df.density))
Data frame 자료 정렬
> x = c(11, 17, 8, 23)
> sort(x) # 8 11 17 23 - 오름차순된 데이터
> rank(x) # 2 3 1 4 - 현재데이터의 등수
> order(x) # 3 1 2 4 - 오름차순된 인텍스
#이를 이용해서 정렬을 한다.
> df[order(df.x1), ] #오름차순된 인덱스를 리턴하는 order 함수를 적용 해서 x1 기준 정열
> df[rev(order(df.x1)), ] #내림차순 정렬
> df[order(df.x1,df.x2), ] #x1,x2 기준으로 정렬
> df[ order(df$x,-df$y) , ] #x1은 오름차순, x2는 내림차순
Data frame 의 Logical Selection
> df[df$x1==T, ] # x1에 값이 참인것만 셀렉션
> df[df$x1 > median(df$x1) & df$x2 <= 4.9, ] # x1이 중앙값보다 크고, x2 가 4.9보다 적은 데이터 셀렉션
Data frame 의 적용함수
# 컬럼별 함수를 적용하는 방법
> sapply(df, mean) # numeric 변수가 아닌경우 경과와 함께 NA 리턴
> sapply(df, is.numeric) # 각 컬럼별 T/F 리턴 , sapply의 리턴형태는 vector, Vector, matrix, array or list 임
> df[,sapply(df, is.numeric)] # numeric 컬럼만 추출
> sapply(df, is.factor) # 각 팩터형인경우 컬럼별 T/F 리턴
> df[,sapply(df, is.factor)] # factor 컬럼만 추출
#각 행끝에 평균값을 추가하는 경우
> x = sapply(df, mean)
> df[length(df$x1)+1,] = x # 맨마지막 row 아래에 컬럼별 평균을 추가
#트렌스포즈
> as.data.frame(t(x)) # transepose 데이터
Data frame 의 결합
-
데이터 프레임 결합은 rbind, cbind ,merge 함수를 이용한다
-
rbind, cbind 변수의 개수에 영향을 많이 받는다.
> A = c("A","B","C") > B = c(1,2,3) > df1 = data.frame(A,B) > A = c("B","C","D") > Y = c(10,20,30) > df2 = data.frame(A,Y) > A = c("B","C","D") > B = c(10,20,30) > df3 = data.frame(A,B) > X = c("B","C","D") > Y = c(10,20,30) > df4 = data.frame(X,Y) # row 열이 같이 않으면 오류가 발생한다. > cbind(df1,df2) # 컬럼명 중복되어도 그냥 가로로 붙이다 A B A Y 1 A 1 B 10 2 B 2 C 20 3 C 3 D 30 > rbind(df1,df2) # 오류가 발생한다. column 명이 일치 하지 않기 때문이다 > rbind(df1,df3) A B 1 A 1 2 B 2 3 C 3 4 B 10 5 C 20 6 D 30
-
merge(df1,df2, key=’’) 변수 개수와 상관없이 key를 통해 유연하게 결합시킨다.
> merge(df1,df3) # 중복컬럼명에서 공통된 키 B,C 기준으로 merge 시킨다. A B Y 1 B 2 10 2 C 3 20 > merge(df1,df3,all=TRUE) # 중복컬럼명에서 공통된 키, 공통되지 않은 키 모두 NA 처리 하여 merge 시킨다. A B Y 1 A 1 NA 2 B 2 10 3 C 3 20 4 D NA 30 > merge(df1,df4) # 컬럼명이 모두 다른 경우 - A1번- B3개,A2번- B3개,A3번- B3개 으로 총 9개 대응 merge, 컬럼은 그냥 추가 A B X Y 1 A 1 B 10 2 B 2 B 10 3 C 3 B 10 4 A 1 C 20 5 B 2 C 20 6 C 3 C 20 7 A 1 D 30 8 B 2 D 30 9 C 3 D 30 # 키를 맞추려면 > merge(df1,df4,by.x=c("A"), by.y = c("X") ) # df1.A 와 df4.X 컬럼을 키로 잡는 옵션 A B Y 1 B 2 10 2 C 3 20
Data frame 의 결측값(NA) 처리
> df[2,3] = df[7,5:7] = NA # 2행3열 NA 처리, 7행5~7열 NA 처리시
> na.omit(df) # df에 NA가 있는 관측값 2,7행은 모두 삭제, na.exclude(df) 와 동일의미
Data frame 중복값 확인 및 제거
> df
cow dog cat bat
1 1 2 3 1
2 1 2 2 1
3 3 2 1 1
4 4 4 2 1
5 3 2 1 1
6 6 1 2 5
7 1 2 3 2
> df[ duplicated(df) , ] # 중복값확인
cow dog cat bat
5 3 2 1 1
# df[ -duplicated(df) , ] 이렇게 사용하면 안된다.
# duplicated(df) 은 TRUE/FALSE 가 리턴 되기 때문에
> unique(df) # 유니크 한것만 확인
cow dog cat bat
1 1 2 3 1
2 1 2 2 1
3 3 2 1 1
4 4 4 2 1
6 6 1 2 5
7 1 2 3 2
댓글남기기