2016-05-23 9 views
0

data.tableの特定の列の値の総和と正味の合計を取得したいとします。この例ではaのために、ネット合計は4で、総合計は、私はこのように、追加の列を追加することによってそれを行うことができます。5.総計と総計の両方をdata.tableの列から取得するR

>dt = data.table(id = c("a","a","a","b","b","b","b","c","c"),value = c(-1,2,3,-3,4,-2,3,-1,1)) 
>head(dt,3) 
    id value 
1: a -1 
2: a  2 
3: a  3 

になるように、総合計では、私は、負の値を無視した意味します:

>dt$grossValue = dt$value 
>dt$grossValue[dt$grossValue < 0] = 0 
>dt[,.(netTotal = sum(value),grossTotal= sum(grossValue)),by=id] 
    id netTotal grossTotal 
1: a  4   5 
2: b  2   7 
3: c  0   1 

しかし、私は実際に数百万行があるので、データへの余分な列を追加する必要がしたくない、と私は複数のカラムにこれを実行したい場合があります。それを直接行う方法はありますか?総額または純額の合計を得る方法を把握することができます(にvalue > 0を追加することによって総額を得る)が、同時に両方ではありません。

答えて

4

これはあなたが探しているものですか?

dt[, .(netTotal = sum(value), grossTotal = sum(value * (value > 0))), by=id] 

私は、両方の列を1回の計算で計算しました。 は、sumから負の値を削除する論理として使用されます。

+0

を掛ける代わりのサブセットでしたはい、それはまさにそれです。相対的にRに慣れておらず、このイディオムに精通していない。ありがとう。 –

0

dplyrパッケージに精通していますか?そうでない場合は、それをチェックしてください。

library(dplyr) 
dt %>% group_by(id) %>% summarize(net = sum(value), gross = sum(ifelse(value > 0, value, 0))) 
1

私はあなたにも総計を求めると思ったので、私は明らかにリクエストを誤解していました。そこでここではそのいわれのないソリューションです:

rbind(dt[,.(netTotal = sum(value),grossTotal= sum(value*(value>0))),by=id], 
data.table(id="all", netTotal=dt[,sum(value)], grossTotal=dt[,sum(value*(value>0))])) 
#------------- 
    id netTotal grossTotal 
1: a  4   5 
2: b  2   7 
3: c  0   1 
4: all  6   13 
0

は、我々はまた、論理インデックスによって

dt[, .(netTotal = sum(value), grossTotal = sum(value[value>0])) , id] 
# id netTotal grossTotal 
#1: a  4   5 
#2: b  2   7 
#3: c  0   1