data.table:计算所有数值变量的累积百分位数
data.table: calculate cumulative percentile for all numeric variables
我有这样的数据
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
的结果感到满意。
解决这个问题的最佳方法是什么?
感谢帮助!
您可以像这样计算单独数据 table 中所有数字列的 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
我有这样的数据
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
的结果感到满意。
解决这个问题的最佳方法是什么?
感谢帮助!
您可以像这样计算单独数据 table 中所有数字列的 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