【发布时间】:2019-09-19 10:14:18
【问题描述】:
我有一个 ID 表和 1000 列随机值。我想对 ID 进行分组并计算每列小于 0.01 的值的数量。
我使用循环迭代合并表,但必须使用eval 和parse 访问列名。不幸的是,运行时间太长了。过去我为不同的问题实现了类似的 for 循环,所以我知道迭代合并不会花费那么长时间。我认为eval 和parse 是降低代码速度的原因。有没有办法在不使用这些功能的情况下做到这一点?
library(data.table)
set.seed(1)
data <- data.table(ID = rep(LETTERS[1:3], 13),
col1 = rnorm(39),
col2 = rnorm(39),
col3 = rnorm(39))
我需要为每一列生成以下内容:data[,sum(col1 < 0.01)]; data[,sum(col2 < 0.01)]; data[,sum(col3 < 0.01)]
columns <- colnames(data)[2:ncol(data)]
d <- data[,.N, keyby = ID][,N := NULL]
for (col in 1:length(columns)) {
sum_table <- data[, sum(eval(parse(text = ..columns[col])) < 0.01), by = ID]
d <- d[sum_table]
}
我希望能够在不使用 eval 和 parse 的情况下重现此问题,因此运行时间更快。
【问题讨论】:
标签: r sum data.table conditional multiple-columns