【问题标题】:data.table: calculate cumulative percentile for all numeric variablesdata.table:计算所有数值变量的累积百分位数
【发布时间】: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

我也会对包含原始 var1var2 的结果感到满意。

解决这个问题的最佳方法是什么?

感谢您的帮助!

【问题讨论】:

  • 没有时间解释,但这应该可以在没有 id 列的情况下为您提供所需的内容:dt[, lapply(.SD, function(x) ecdf(x)(x)), .SDcols = sapply(dt, is.numeric)]。然后你可以cbind id 列之后。
  • 试试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


【解决方案1】:

您可以为单独的数据表中的所有数字列计算 ecdf,如下所示:

dt2 = as.data.table(lapply(dt,function(x){if(is.numeric(x)){ecdf(x)(x)}}))

结果:

> dt2
        var1      var2
1: 0.1666667 0.8333333
2: 0.3333333 0.3333333
3: 0.5000000 0.6666667
4: 0.6666667 1.0000000
5: 0.8333333 0.1666667
6: 1.0000000 0.5000000

如果你想cbind这个结果到原来的dt,你可以使用paste0改变列名:

colnames(dt2) = paste0("centile_",colnames(dt2))

结果:

> dt2
   centile_var1 centile_var2
1:    0.1666667    0.8333333
2:    0.3333333    0.3333333
3:    0.5000000    0.6666667
4:    0.6666667    1.0000000
5:    0.8333333    0.1666667
6:    1.0000000    0.5000000

【讨论】:

  • 谢谢!它几乎完全符合我的需要:您的结果不包含id,如果我只是尝试cbind,我得到的结果与原始数据不同。有没有办法将其保留在结果中?
  • 只需在末尾添加和else 声明:as.data.table(lapply(dt,function(x){if(is.numeric(x)){ecdf(x)(x)} else x}))
猜你喜欢
  • 1970-01-01
  • 2021-09-23
  • 2014-05-11
  • 2017-03-03
  • 2018-08-07
  • 2021-10-15
  • 2017-08-03
  • 2022-01-22
  • 2021-07-27
相关资源
最近更新 更多