在数据表中汇总的许多级别行

时间:2018-04-03 20:54:10

标签: r loops data.table row

我有简单的数据表:

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))

3 个答案:

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