按分位数列出多个R data.table列,其中值为

时间:2017-09-06 14:17:01

标签: r data.table

这是我的示例代码:

library(data.table)
library(binr)

DT <- data.table(A=rnorm(100), B=rnorm(100), C=rnorm(100))
na_rows <- sample(DT[,.N], 10)
cols = c("A", "B")
DT[na_rows, (cols):=NA]

DT[, (cols) := lapply(.SD, bins.quantiles, target.bins=5, max.breaks=5), .SDcols=cols]
DT[, (cols) := lapply(.SD, bins.quantiles, target.bins=5, max.breaks=5, na.rm=TRUE), .SDcols=cols]

最后两行都不起作用,分别给出以下错误:

1) Error in quantile.default(x, probs = 0:nbreak/nbreak) : 
  missing values and NaN's not allowed if 'na.rm' is FALSE
2) Error in FUN(X[[i]], ...) : unused argument (na.rm = TRUE)

所需的输出是A列和B列中的值被整数1-5替换,对应于分位数(因此每列的前1/5值将更改为5,下一个1/5到4等)并且NAs仍然是NA

我想知道如何解决这个问题,不必是binr库(data.table可能是必需的,因为我需要在很多行/列上执行此操作)。非常感谢解释为什么我的方法也是错误的

1 个答案:

答案 0 :(得分:1)

发现lsr包中的quantileCut有点做了我想做的事情(尽管后来必须对数字做因素)

library(data.table)
library(lsr)

DT <- data.table(A=rnorm(100), B=rnorm(100), C=rnorm(100))
na_rows <- sample(DT[,.N], 10)
cols = c("A", "B")
DT[na_rows, (cols):=NA]

DT[, (cols) := lapply(.SD, quantileCut, n=5), .SDcols=cols]
DT[, (cols) := lapply(.SD, as.numeric), .SDcols=cols]