使用数据子集时如何创建新列并计算data.table中的中位数

时间:2018-06-30 15:04:40

标签: r data.table

嗨,我有这样的数据:

  date    type    data
198101       1     0.1
198101       1     0.3
198101       2     0.5
198102       1     1.2
198102       1     0.9
198102       2     0.7
198102       2     0.3

我想创建一个新列以在类型== 1时根据条件显示每个月的中位数。

我想成为的结果就是这样

  date    type    data    P50
198101       1     0.1    0.2
198101       1     0.3    0.2
198101       2     0.5    0.2
198102       1     1.2   1.05
198102       1     0.9   1.05
198102       2     0.7   1.05
198102       2     0.3   1.05

目前我是用这种方式,让我们将上面的data.table称为dt

dt.median = dt[type == 1]
dt.median = dt.median[, .(P50 = median(data)), by=.(date)]

然后将其合并回原始dt

dt = dt[dt.median, nomatch = 0, by=.(date)]

是否有使用.SD或.SDcol的更快方法?我想练习使用.SD,但是无法用一行代码来弄清楚?

我现在能想到的是

dt[, P50 := * .SD[type == 1] ...  * , by =.(date)]

但是我不知道要使用什么语法来计算中位数* .SD [type == 1] ... *,

我们将不胜感激!

2 个答案:

答案 0 :(得分:2)

只需使用逻辑向量为组内的数据值建立索引,并使用data.table特殊赋值运算符:=

进行赋值
> dt[ , P50 := median(data[type==1]), by=.(date)]
> dt
     date type data  P50
1: 198101    1  0.1 0.20
2: 198101    1  0.3 0.20
3: 198101    2  0.5 0.20
4: 198102    1  1.2 1.05
5: 198102    1  0.9 1.05
6: 198102    2  0.7 1.05
7: 198102    2  0.3 1.05

答案 1 :(得分:0)

从底数R

v=dt$data
v[dt$type!=1]=NA
ave(v,dt$date,FUN=function(x) median(x,na.rm=T))
[1] 0.20 0.20 0.20 1.05 1.05 1.05 1.05