R ::基于另一列的跨列名称的动态和

时间:2018-03-08 13:48:17

标签: r sum apply

数据集:

sumx是所需的输出列

id  a1  a2  a3  a4  a5  mon sumx
x   1   2   1   0   1   2   4
y   2   3   1   0   3   4   3
z   0   0   2   2   0   1   4

要求:(基于mon ):

for x: sumx = sum(a2 to a5)
for y: sumx = sum(a4 to a5)
for z: sumx = sum(a1 to a5)

我尝试使用的代码给出了一个错误,指出“数值表达式有n个元素:只使用第一个

df$sumx <- rowSums(df[c(paste("a", df$mon:5 , sep = ""))])

我想要实现的是,基于mon变量,创建的新变量应该从变量序列(a1到a5)求和,从mon中的相应数字开始到序列中的最后一个变量。

2 个答案:

答案 0 :(得分:0)

我们可以使用sapply并且对于每一行计算sum从包含其名称mon中的列grep(pattern = df$mon[[x]], x = names(df))的相应值的列开始计算a5pos_a5 <- which(names(df) == "a5") df$sumx <- sapply(1:nrow(df), function(x) sum(df[x, grep(pattern = df$mon[[x]], x = names(df)):pos_a5])) # id a1 a2 a3 a4 a5 mon sumx #1 x 1 2 1 0 1 2 4 #2 y 2 3 1 0 3 4 3 #3 z 0 0 2 2 0 1 4 的位置。

date == now

答案 1 :(得分:0)

您可以尝试一个简单的for循环:

test.dat <- matrix(c(1,2,1,0,1,2,2,3,1,0,3,4,0,0,2,2,0,1), nrow = 3, byrow = TRUE)
sum.vec <- c()
for (i in 1:nrow(test.dat)){
  test.vec <- c()
  for (j in test.dat[i,6]:5){
    test.vec <- c(test.vec, test.dat[i,j])  
  }
  sum.vec[i] = sum(test.vec)
}
test.dat <- cbind(test.dat, sum.vec)