R 如何使用data.table根据条件计算列和?

R 如何使用data.table根据条件计算列和?,r,sum,data.table,conditional,multiple-columns,R,Sum,Data.table,Conditional,Multiple Columns,我有一个ID表和1000列随机值。我想对ID进行分组,并计算每列小于0.01的值的数量 我使用循环以迭代方式合并表,但必须使用eval和parse访问列名。不幸的是,它的运行时间太长了。我在过去为不同的问题实现了类似的for循环,所以我知道迭代合并不会花那么长时间。我认为eval和parse是降低代码速度的原因。有没有一种不用这些函数就可以做到这一点的方法 library(data.table) set.seed(1) data <- data.table(ID = rep(LETTERS

我有一个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.table)
种子(1)

数据我们可以使用
lappy
.SDcols
中指定感兴趣的列后,循环data.table(
.SD
)的子集,并计算小于0.01的元素数

data[, lapply(.SD,  function(x) sum(x < 0.01)), .SDcols = col1:col3]

如果有分组变量,也可以通过
指定

data[, lapply(.SD,  function(x) sum(x < 0.01)), .SDcols = col1:col3, by = ID]
data[, as.list(colSums(.SD < 0.01)), .SDcols = col1:col3, by = ID]
data[,lappy(.SD,函数(x)和(x<0.01)),.SDcols=col1:col3,by=ID]
数据[,as.list(colSums(.SD<0.01)),.SDcols=col1:col3,by=ID]

是的,这很快很简单,效果很好。在使用
数据时,我并不总是考虑
lappy
。table
。如果是by=,您还可以重塑
dcast(melt(data,id=“id”)[value<0.01],id~ variable)
@abbas如果执行许多这样的操作,以melt格式保存数据可能是有意义的。
data[, colSums(.SD < 0.01), .SDcols = col1:col3]
data[, lapply(.SD,  function(x) sum(x < 0.01)), .SDcols = col1:col3, by = ID]
data[, as.list(colSums(.SD < 0.01)), .SDcols = col1:col3, by = ID]