嗨,我有这样的数据:
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
当 type == 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] ... *,
帮助将不胜感激!
只需使用逻辑向量索引组内的数据值,并使用 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
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句