【问题标题】:data.table column assignment within a loop循环内的 data.table 列分配
【发布时间】:2017-04-11 15:59:23
【问题描述】:

这就是我的 data.table 的样子。最右边的三列是我的 desired 列。

 library(data.table)
    dt <- fread('
        Product  Sales    A-CumSales   B-CumSales  C-CumSales 
        A          10        10            0          0
        B          5         10            5          0
        A          10        20            5          0
        A          20        40            5          0
        B          10        40           15          0
        C          5         40           15          5
        C          5         40           15          10
    ')
 dt[, Product:= as.factor(Product)]

我的Product 列中的级别总是在变化。我正在尝试做一个循环,为每个Product 创建一个单独的列,计算相应Product 的累积Sales

我试过了:

for (i in levels(dt$Product)) {
  dt[,i:= cumsum((Product == "i") * Sales)]
}

【问题讨论】:

  • 根据您的输入,我认为您的 C-CumSales 不正确
  • 好吧,你可以放括号,比如(i) :=
  • @Frank 你是对的。我想我的意思是dcast(dt[, 1:2, with = FALSE], Product + 1:nrow(dt) + rowid(Product)~Product,value.var = "Sales", fill = 0)[, c("A", "B", "C") := lapply(.SD, cumsum), .SDcols = A:C][]
  • @akrun 感谢您的关注。我修好了。
  • @Frank 谢谢你的解决方案!

标签: r data.table apply lapply


【解决方案1】:

这是我根据 OP 的代码尝试的:

dt <- dt[, .(Product, Sales)]

plevels <- levels(dt$Product)

dt[, c(paste(plevels, 'CumSales', sep = '-')) :=
        lapply(plevels, function(x) cumsum(Sales * (Product == x)))]

#    Product Sales A-CumSales B-CumSales C-CumSales
# 1:       A    10         10          0          0
# 2:       B     5         10          5          0
# 3:       A    10         20          5          0
# 4:       A    20         40          5          0
# 5:       B    10         40         15          0
# 6:       C     5         40         15          5
# 7:       C     5         40         15         10

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-11-20
    • 2014-12-19
    • 2012-05-22
    • 1970-01-01
    • 2016-09-05
    • 1970-01-01
    相关资源
    最近更新 更多