数据集:
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中的相应数字开始到序列中的最后一个变量。
答案 0 :(得分:0)
我们可以使用sapply
并且对于每一行计算sum
从包含其名称mon
中的列grep(pattern = df$mon[[x]], x = names(df))
的相应值的列开始计算a5
列pos_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)