2017-04-11 8 views
0

これは私のdata.tableの外観です。右端の3つの列は、の希望の列です。data.tableループ内の列の割り当て

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の累積Salesを計算する各Productのための別の列を作成しているループを実行しようとしています。

私が試してみました:ここ

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

私がすることができます、あなたのC-CumSalesがあなたの入力 – akrun

+2

まあ基づいて、間違っていると思います'(i):='のように括弧を入れます。 – Frank

+1

@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

答えて

2

は、私は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 
+0

ありがとうございます。 – gibbz00

関連する問題