3 분 소요

많이 활용되는 DataFrame의 조작 방법을 알아본다.

Data frame 그룹별 처리

  1. aggregate() 함수 적용

    • 함수를 적용할 변수 설정 (x=), 그룹 변수 설정 (by=) 반드시 리스트이어야 함, 평균과 같은 함수 설정 (FUN=)
     # 2,3,5,7 컬럼을 by에 그룹별로 평균값 산출
     > aggregate(x=df[, c(2,3,5,7)], by=list(df$Vegetation), FUN=mean)
    
  2. 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    

태그: ,

카테고리:

업데이트:

댓글남기기