假设我有一个数据框,如:
`M-x` itail
我想要的是添加来自A-E的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))
和*1
列。这似乎很容易实现,但我的案例的关键问题是df非常宽,我更喜欢不使用列名为*2
的所需输出键入A-E。
答案 0 :(得分:3)
我们可以sub
&#39; df&#39;的列名除了第一个(&#39; ID&#39;)之外,通过删除数字部分(使用list
)创建的列名的子字符串,使用{{1}循环遍历sapply
元素},列出&#39; df&#39;的列。根据索引,获取rowSums
和cbind
第一列(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