根据汇总统计数据筛选出data.table列

3

我经常需要从data.table中过滤出方差较低的列。列名事先不知道。

dt = data.table(mtcars)

# calculate standard deviation with arbitrary max value of 1:
mask = dt[,lapply(.SD, function(x) sd(x, na.rm = TRUE) > 1)]

# The columns with the FALSE values in row 1 need to be removed
mask.t = t(mask)
mask.t = which(mask.t)
dt[,mask.t,with=FALSE] 

上述方法比较笨重。有没有更加优雅的方式来从数据表中过滤掉那些列统计值为TRUE的列呢?

2
dt[, names(mask)[unlist(mask)], with=FALSE] 可能是这样的吗?或者 dt[, names(which(unlist(mask))), with=FALSE] - Arun
谢谢Arun,它们都可以。我错过了unlist部分。 - Henk
1个回答

1
这些工作:
dt[, .SD, .SDcols=unlist(mask)] 

dt[, .SD, .SDcols=which(unlist(mask))]

现在一起来:

variance.filter = function(df) {
  mask = df[,lapply(.SD, function(x) sd(x,na.rm = TRUE) > 1)]
  df = df[, .SD, .SDcols = unlist(mask)] 
}

在当前开发版本的data.table(1.12.9)中,.SDcols接受列的函数过滤器,因此以下内容可行:
variance.filter = function(df) {
  df[ , .SD, .SDcols = function(x) sd(x, na.rm = TRUE) > 1]
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接