数据
考虑你有这个data.table或dataframe(我正在使用data.table):
a <- c(1, 6.7, 7.0, 6.5, 7.0, 7.2, 4.2, 5, 6.6,6.7)
b <- c(2,5.0, 3.5, 4.9, 7.8, 9.3, 8.0, 7.8, 8.0,10)
c <- c(3, 7.0, 5.5, 7.2, 7.7, 7.2, 8.0, 7.6, 7,6.7)
d <- c(4, 7.0, 7.0, 7.0, 6.9, 6.8, 9.0, 6.0, 6.6,6.7)
df <- data.frame(rbind(a,b,c,d))
X1 X2 X3 X4 X5 X6 X7 X8 X9 X10
a 1 6.7 7.0 6.5 7.0 7.2 4.2 5.0 6.6 6.7
b 2 5.0 3.5 4.9 7.8 9.3 8.0 7.8 8.0 10.0
c 3 7.0 5.5 7.2 7.7 7.2 8.0 7.6 7.0 6.7
d 4 7.0 7.0 7.0 6.9 6.8 9.0 6.0 6.6 6.7
问题
我试图将X3和X4作为第一行,X3和X4以及X5作为第二行,等等......
我做了什么
我有一个名为iter的矢量:
iter <- c(1,2,3,4)
我所做的是for循环
for(i in 1:nrow(df)){
df$sum[i] <- sum(as.numeric(df[i,2:(2+iter[i])]),na.rm=T)}
你知道没有for循环的方法吗?
预期输出
output
13.7 #correspond to df[1,X3]+df[1,X4]
13.4 #correspond to df[2,X3]+df[2,X4]+df[2,X5]
27.4 #correspond to df[3,X3]+df[3,X4]+df[3,X5]+df[3,X6]
37.4 #correspond to df[4,X3]+df[4,X4]+df[4,X5]+df[4,X6]+df[4,X7]
修改
iter <- c(1,2,3,4)
这里完全是任意的,所以我需要一个解决任何iter值的方法
答案 0 :(得分:3)
df
的元素是使解决方案复杂化的因素。首先,我将相关列转换为数字矩阵。
修改:更新版df
无因素
mat <- sapply(df[,-1], as.numeric)
rowSums(mat*cbind(TRUE, lower.tri(mat[,-1], diag = TRUE)))
[1] 13.7 13.4 27.4 34.7
使用任意iter:
index.mat = t(sapply(iter, function(x){rep(c(TRUE,FALSE), times = c(x+1, ncol(df)-x))}))
rowSums(df[,-1]*index.mat)
20.2 38.5 34.6 27.9
答案 1 :(得分:3)
您可以将Reduce
与accumulate = TRUE一起使用,然后提取值。
# initialize iter variable
iter <- 1:4
# calculate cumulative row sums, dropping initial list element
vals <- Reduce("+", df[2:10], accumulate=TRUE)[-1]
# pull out what you want with recursive indexing and sapply
sapply(1:nrow(df), function(x) vals[[c(iter[x], x)]])
[1] 13.7 13.4 27.4 34.7
答案 2 :(得分:1)
这个怎么样? 如果iter指定列数:
iter <- c(2,5,4,2)
sapply(1: length(iter),(function(i){
ri <- iter[i]
sum(df[i, 3:(3+ri-1)])
}))
如果您将其用于行的顺序(例如,用于重新排序数据框中的行)
iter <- c(1,2,3,4)
sapply(1: length(iter),(function(i){
ri <- iter[i]
sum(df[ri, 3:(3+i)])
}))