data.table group by with filter condition

时间:2013-11-16 16:45:24

标签: r data.table

根据下面的data.table,我想创建一个新的列,即value按地区求和,period == 0

   region period value
1:     US      0    10
2:     US      1    11
3:  Japan      0    12
4:  Japan      1    13

这种方法的典型data.frame方法是创建一个单独的框架,按周期过滤,按区域求和,然后以region作为关键字与原始框架合并。我想知道data.table使用data.table groupby synytax是否存在单线方法。我最接近的是下面的两线方法。

x1 <- data.table(
  region=c("US","US","Japan","Japan"),
  period=c(0,1,0,1),
  value=10:13)

x1[period==0,value0:=sum(value),by=region]
x1[,value0:=min(value0,na.rm=T),by=region]


   region period value value0
1:     US      0    10     10
2:     US      1    11     10
3:  Japan      0    12     12
4:  Japan      1    13     12

3 个答案:

答案 0 :(得分:4)

我不确定这是否是“data.table”方式,但你可以尝试这样的事情:

x1[, value0 := sum(value[period == 0]), by = region]
x1
#    region period value value0
# 1:     US      0    10     10
# 2:     US      1    11     10
# 3:  Japan      0    12     12
# 4:  Japan      1    13     12

答案 1 :(得分:2)

我更喜欢阿南达的方式,但这里有另一种选择:

x1[x1[period==0,sum(value),by=region], value0 := V1, on="region", by=.EACHI]

答案 2 :(得分:0)

这使得分组范围更明确......

> x1[,value0:=.SD[period==0,mean(value)],by=region]                                                                                                                                 
> x1                                                                                                                                                                                
   region period value value0                                                                                                                                                       
1:     US      0    10     10                                                                                                                                                       
2:     US      1    11     10                                                                                                                                                       
3:  Japan      0    12     12                                                                                                                                                       
4:  Japan      1    13     12