2013-01-02 18 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

我認爲你是保證手段被接管在相同長度的列?如果不是,你可能想用「NA」填充你的數據框,以便它們是。 –

+0

是的,數據幀是「滿」。 –

回答

1

聽起來好像在現實生活中,你只是要單獨選擇每組列。也許爲你做最簡單的事情就是選擇你的欄目,如「A」和「B」,然後......

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

現在,假設你有名稱的列表,或索引(沒有按」問題),列的。然後你可以做這樣的事情。

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))