为什么这不适用于data.table
?
适用于data.frame
。有没有办法用数据表做到这一点?
x <- data.table(v1=1:20,v2=1:20,v3=1:20,v4=letters[1:20])
y <- x[,sapply(x,is.numeric)]
返回:
v1 v2 v3 v4
TRUE TRUE TRUE FALSE
答案 0 :(得分:16)
没有with = FALSE
的另一个解决方案是.SDcols
参数:
x[, .SD, .SDcols = which(sapply(x, is.numeric))]
这也有效:
x[, .SD, .SDcols = sapply(x, is.numeric)]
答案 1 :(得分:9)
data.table
需要with=FALSE
来获取列号。
tokeep <- which(sapply(x,is.numeric))
x[ , tokeep, with=FALSE]
答案 2 :(得分:0)
您也可以尝试:
x1 <- x[,Filter(is.numeric, .SD)]
head(x1,3)
# v1 v2 v3
#1: 1 1 1
#2: 2 2 2
#3: 3 3 3
虽然,我不得不承认,对于更大的数据集来说,它的速度很慢。
答案 3 :(得分:0)
类似于@akrun的答案
Filter(is.numeric, x)
答案 4 :(得分:0)
我们可以编写一个名为where()
的自定义帮助程序,然后我们可以满足一个满足data.frame / data.table where
f
的问题:
where <- function(x, f) {
colnames(x)[vapply(x, f, logical(1))]
}
df[, where(df, is.numeric), with = FALSE]