我的數據是這樣data.table:計算百分所有數值變量
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,函數(X)ECDF(X)(X)) ,.SDcols = sapply(dt,is.numeric)]'。然後你可以在後面加上id列。 – jav
嘗試mutate_at(dat,vars(starts_with(「var」)),function(x){ecdf(x)(x)})或mutate_if(dat,is.numeric,function(x){ecdf(x )(x)})' –
@jav,有沒有一種方法在結果中保留'id'?由於某種原因,簡單的綁定給我的結果與原始數據相比是不準確的 –