2016-08-30 48 views
1

假設我有一個數據幀等類合併一個數據幀,這是非常寬的R內部列

set.seed(123) 
df<-data.frame(ID=letters[1:10], 
      A1=rnorm(10),A2=rnorm(10,1,3), 
      B1=rnorm(10),B2=rnorm(10,1,3), 
      C1=rnorm(10),C2=rnorm(10,1,3), 
      D1=rnorm(10),D2=rnorm(10,1,3), 
      E1=rnorm(10),E2=rnorm(10,1,3)) 

我想要的東西是從A-E加起來*1*2列。這似乎很容易實現,但對我的情況來說,關鍵問題是DF非常寬,我更喜歡不輸入具有期望輸出的A-E,列名爲c("ID", "A", "B", "C", "D", "E")

回答

3

我們可以通過與sapply除去通過list元件的數字部分(使用sub),環split「DF」的列名,除了由所創建的列名的字符串的第一個(「ID」),子集基於索引「DF」的列,得到rowSumscbind與第一列(df[1]

cbind(df[1], sapply(split(names(df)[-1], sub("\\d+", "", names(df)[-1])), 
           function(x) rowSums(df[x]))) 
# ID   A   B   C   D   E 
#1 a 4.1117697 1.2115690 1.0652486 -0.09345402 3.98627575 
#2 b 1.8492640 -0.1031894 0.7064425 -6.42983008 3.03047128 
#3 c 3.7610227 2.6593725 -0.3940077 3.68400819 1.34553517 
#4 d 1.4025565 2.9055092 7.2747628 -2.14617767 -0.23934168 
#5 e -0.5382357 2.8397040 1.5306490 -2.13581708 4.86147078 
#6 f 8.0758044 1.3792275 4.4263032 4.38024275 -0.46899680 
#7 g 2.9544676 3.4995400 -4.0491432 0.59389076 8.65883799 
#8 h -6.1649127 0.9676380 2.2871859 -2.60914891 6.03301337 
#9 i 2.4172149 -1.0560249 2.1515278 2.46617791 -0.03303266 
#10 j -0.8640362 1.1124019 1.5644556 2.63341060 -0.93045508