我有这样的数据集
df = data.frame('a_1' = c(1,0,0), 'b_1' = c(1,0,0), 'c_1' = c(1,0,0),
'a_2' = c(0,1,0), 'b_2' = c(0,1,0), 'c_2' = c(0,1,0))
我想要
> df
a b c
1 1 1 1
2 1 1 1
3 0 0 0
我当然能做到
df$a = df$a_1+df$a_2
df$b = df$b_1+df$b_2
df$c = df$c_1+df$c_2
并删除冗余列。但在真实数据集中,更多列和这种方式需要很长时间。有更快的方法吗?我必须添加'name'而不是'_number'
答案 0 :(得分:3)
我们的想法是从_.*
部分删除名称并添加匹配的名称,即
sapply(unique(sub('_.*', '', names(df))), function(i) rowSums(df[grepl(i, names(df))]))
给出,
a b c [1,] 1 1 1 [2,] 1 1 1 [3,] 0 0 0
答案 1 :(得分:1)
在这种情况下,一个简单的
df1 <- mapply(`+`, df[1:3], df[4:6])
> df1
a_1 b_1 c_1
[1,] 1 1 1
[2,] 1 1 1
[3,] 0 0 0
会做到这一点。您的真实数据是否具有可比较的格式?
编辑:正如@Sotos所说,只需使用
df1 <- df[1:3]+df[4:6]
就够了。