【发布时间】:2017-08-15 15:45:49
【问题描述】:
我有这样的数据
set.seed(1)
dt <- data.table(id = c("A", "A", "B", "B","C", "C"),
var1 = c(1:6),
var2 = rnorm(6))
> dt
id var1 var2
1: A 1 -0.6264538
2: A 2 0.1836433
3: B 3 -0.8356286
4: B 4 1.5952808
5: C 5 0.3295078
6: C 6 -0.8204684
但有几十个数值变量。我想使用data.table 计算每个观察值和每个数字变量的百分位数,同时保持键标识符 (id) 不变。在dplyr 我可以这样做:
mutate_if(dt, is.numeric, function(x) { ecdf(x)(x) })
id var1 var2
1 A 0.1666667 0.5000000
2 A 0.3333333 0.6666667
3 B 0.5000000 0.1666667
4 B 0.6666667 1.0000000
5 C 0.8333333 0.8333333
6 C 1.0000000 0.3333333
我也会对包含原始 var1 和 var2 的结果感到满意。
解决这个问题的最佳方法是什么?
感谢您的帮助!
【问题讨论】:
-
没有时间解释,但这应该可以在没有 id 列的情况下为您提供所需的内容:
dt[, lapply(.SD, function(x) ecdf(x)(x)), .SDcols = sapply(dt, is.numeric)]。然后你可以cbindid 列之后。 -
试试
mutate_at(dat, vars(starts_with("var")), function(x) { ecdf(x)(x) })或mutate_if(dat, is.numeric, function(x) { ecdf(x)(x) }) -
@jav,有没有办法在结果中保留
id?出于某种原因,与原始数据相比,简单的 cbinding 给了我不准确的结果 -
@StevenBeaupré:这可以解决问题,但我正在处理数百万个观察结果,因此我需要在
data.table... -
@Frank:好点,现在将编辑我的帖子
标签: r data.table numeric percentile