R data.table:计算所有数值变量的累积百分位数

R data.table:计算所有数值变量的累积百分位数,r,data.table,numeric,percentile,R,Data.table,Numeric,Percentile,我有这样的数据 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.595

我有这样的数据

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
我也会对结果感到满意,包括原始的
var1
var2

最好的方法是什么


谢谢你的帮助

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

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
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
> 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
如果要
cbind
将此结果绑定到原始dt,可以使用
paste0
更改列名:

colnames(dt2) = paste0("centile_",colnames(dt2))
结果:

> 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
> 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列的情况下满足您的需要:
dt[,lapply(.SD,function(x)ecdf(x)(x)),.SDcols=sapply(dt,is.numeric)]
。然后你可以
cbind
id列。尝试
mutate_at(dat,vars(以(“var”)开头)、function(x){ecdf(x)(x)}
mutate_if(dat,is.numeric,function(x){ecdf(x)(x)}
@jav,有没有办法在结果中保留
id
?有些情况下,与原始数据相比,简单的C绑定会给我带来不准确的结果reason@StevenBeaupré:那就行了,但我正在处理数以百万计的观察结果,因此我需要在
数据中进行。table
。@Frank:好的,我现在就编辑我的帖子谢谢!它几乎完全符合我的需要:您的结果不包含
id
,如果我只是尝试
cbind
它,我会得到与原始数据不同的结果。有没有办法将其保存在结果中?只需在末尾添加和
else
语句:
as.data.table(lappy(dt,函数(x){if(Is.numeric(x)){ecdf(x)(x)}else x}))