我有简单的数据表:
dt <- data.table(a <- c(1:4), b <- c(11:14))
我需要在循环中求和行。例如,将第二行添加到第一行,将第三行添加到第一行,将第四行添加到第一行。下一步是将第三行添加到第二行,将第四行添加到第二行,后面的第四行添加到第三行。 我需要为数百行重复这些操作。 我知道如何制作第一个循环,任何人都知道如何制作第二个循环?或者可能是没有循环的另一个想法。我的第一个循环:
datalist <- list()
for(i in 2:nrow(dt)){
datalist[i] = sum(dt[1, ] + dt[i, ])
}
我想要的输出,(可以在列表,矢量,数据表中):
dt2 <- data.table(d <- c(26,28,30, 30,32, 34))
答案 0 :(得分:0)
您可以使用rowSums
然后将第一行总和添加到所有其他行总和。
d <- rowSums(dt)
d[-1] <- d[-1] + d[1]
# [1] 12 26 28 30
答案 1 :(得分:0)
使用像zoo::rollapply
:
library(zoo)
dt <- data.table(a=c(1:4), b=c(11:14))
print(dt)
# a b
# 1: 1 11
# 2: 2 12
# 3: 3 13
# 4: 4 14
dt <- transform(dt, expandingSum=rollapply(rowSums(dt),
width=seq(nrow(dt)), sum, align="right"))
print(dt)
# a b expandingSum
# 1: 1 11 12
# 2: 2 12 26
# 3: 3 13 42
# 4: 4 14 60
align
参数定位窗口(在这种情况下,"right"
允许我们回顾一定数量的行)。 width
参数确定滚动计算中要使用的行数,因此我们提供一个序列(此处,seq(nrow(dt))
生成[1] 1 2 3 4
),以便对于每个后续计算,{{1}一个人成长。
答案 2 :(得分:0)
有两个循环外循环提供要添加的行,内循环添加相应的行
datalist <- c()
k=2
for(j in 1:nrow(dt)){
if(k < nrow(dt)){
for(i in k:nrow(dt)){
print(k)
a <- sum(sum(dt[j,]),sum(dt[i,]))
datalist <- c(datalist,a)
}
}
k=k+1
}