2013-01-02 2 views
1

나는 몇개의 열을 추가 할 필요가있는 50 개 이상의 열이있는 데이터 프레임을 가지고 있습니다. 각 열에는 원래 열 몇 개를 포함 할 것입니다.데이터 프레임에서 열 그룹의 평균 계산하기

열 그룹의 길이가 다양하고 열 이름에 속한 그룹을 식별하는 요소가 포함되어 있지 않습니다.

이 작업을 효율적으로 수행하는 방법에 대한 제안 사항에 감사드립니다.

이 간략화 된 예에서 보여주세요 열 그룹은 (a가, b) (C, D, E) (F는, g), 데이터 프레임의 TB에 정의되는 바와 같이 :

tb<-data.frame(a=runif(10)*100,b=runif(10)*100,c=runif(10)*100, 
       d=runif(10)*100,e=runif(10)*100,f=runif(10)*100,g=runif(10)*100) 
tb 

    a  b   c  d  e   f   g 
1 26.550866 20.59746 93.470523 48.20801 82.09463 47.761962 91.287592 
2 37.212390 17.65568 21.214252 59.95658 64.70602 86.120948 29.360337 
3 57.285336 68.70228 65.167377 49.35413 78.29328 43.809711 45.906573 
4 90.820779 38.41037 12.555510 18.62176 55.30363 24.479728 33.239467 
5 20.168193 76.98414 26.722067 82.73733 52.97196 7.067905 65.087047 
6 89.838968 49.76992 38.611409 66.84667 78.93562 9.946616 25.801678 
7 94.467527 71.76185 1.339033 79.42399 2.33312 31.627171 47.854525 
8 66.079779 99.19061 38.238796 10.79436 47.72301 51.863426 76.631067 
9 62.911404 38.00352 86.969085 72.37109 73.23137 66.200508 8.424691 
10 6.178627 77.74452 34.034900 41.12744 69.27316 40.683019 87.532133 

작업 결과는 다음과 같을 수 있습니다.

a  b  c  d  e  f  g  mean_ab mean_cde mean_fg 
1 26.551 20.597 93.471 48.208 82.095 47.762 91.288 23.574 74.591 69.525 
2 37.212 17.656 21.214 59.957 64.706 86.121 29.360 27.434 48.626 57.741 
3 57.285 68.702 65.167 49.354 78.293 43.810 45.907 62.994 64.272 44.858 
4 90.821 38.410 12.556 18.622 55.304 24.480 33.239 64.616 28.827 28.860 
5 20.168 76.984 26.722 82.737 52.972 7.068 65.087 48.576 54.144 36.077 
6 89.839 49.770 38.611 66.847 78.936 9.947 25.802 69.804 61.465 17.874 
7 94.468 71.762 1.339 79.424 2.333 31.627 47.855 83.115 27.699 39.741 
8 66.080 99.191 38.239 10.794 47.723 51.863 76.631 82.635 32.252 64.247 
9 62.911 38.004 86.969 72.371 73.231 66.201 8.425 50.457 77.524 37.313 
10 6.179 77.745 34.035 41.127 69.273 40.683 87.532 41.962 48.145 64.108 

미리 제안 해 주셔서 감사합니다.

+0

나는 길이가 같은 열을 의미한다고 보증합니다. 그렇지 않은 경우 데이터 프레임을 '없음'으로 채울 수 있습니다. –

+0

예, 데이터 프레임이 "가득 참"입니다. –

답변

1

실생활 에서처럼 각 열 집합을 독립적으로 선택하려고합니다. 아마 당신이 할 수있는 가장 쉬운 것은 '케이 ("A"와 "B"와 같은, 당신의 열을 선택하고 ...

tb$mean_ab <- rowMeans(tb[,c('a','b')]) 

를 이제, 당신은 이름 목록이 있다고 가정, 또는 인덱스입니다 t 문제). 그런 다음 당신은 이와 같은 것을 할 수 있습니다.

cols <- list(c("a", "b"), c("c", "d", "e")) 
meanCols <- lapply(cols, function(x) rowMeans(tb[,x])) 
meanCols <- data.frame(meanCols) 

이렇게 생성하면됩니다. 열 이름 목록을 사용하여 값의 이름을 지정하고 tb에 다시 추가하면 다음이 작동합니다.

meanIDs <- do.call(paste0, cols) 
names(meanCols) <- paste0('mean_', meanIDs) 
tb <- cbind(tb, meanCols) 

그러나 소수의 열만이라면 새로운 열 IDS로 첫 번째 명령을 몇 번 쓰기가 쉽습니다.

1

아마도 그럴 것 같은가요? 좀 더 모듈화되어 미래에 타이핑을 줄일 수 있습니다.

groups <- list(c("a", "b"), c("c", "d", "e"), c("f", "g"))                        

tmp <- sapply(groups, function(set) {                             
    res <- rowMeans(tb[,set])                               
    return(res)                                   
})                                      

res <- data.frame(tb, tmp)                                
colnames(res) <- c(colnames(tb),                              
        sapply(groups,                              
          function(x) paste("mean", paste(x, collapse=""), sep="_"))) 
1

또 다른 방법으로 split.default을 사용하여 열을 그룹화합니다.

grouping <- c('mean_ab', 'mean_ab', 'mean_cde', 'mean_cde', 'mean_cde', 'mean_fg', 'mean_fg') 
data.frame(tb, lapply(split.default(tb, grouping), rowMeans)) 
관련 문제