根据规则添加列

时间:2018-01-24 10:50:45

标签: r

我有这样的数据集

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'

2 个答案:

答案 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]

就够了。