这是我的示例代码:
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可能是必需的,因为我需要在很多行/列上执行此操作)。非常感谢解释为什么我的方法也是错误的
答案 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]