将函数应用于满足data.table中列子集的条件的子集元素

时间:2017-07-20 13:53:08

标签: r data.table

考虑data.table,exampleDT

set.seed(7)
exampleDT = data.table(colA = rnorm(10,15,5),
                       colB = runif(10,100,150),
                       targetA = rnorm(10,12,2),
                       targetB = rnorm(10,8,4))

如果我想计算列targetA中所有元素的平均值,例如,低于某个阈值 - 例如10 - 我可以执行以下操作:

examp_threshold = 10
exampleDT[targetA<examp_threshold,mean(targetA)]
# [1] 9.224007566814299

如果我想计算列targetAtargetB中所有元素的平均值,例如,我可以执行以下操作:

target_cols = names(exampleDT)[which(names(exampleDT) %like% "target")] 
exampleDT[,lapply(.SD,mean),.SDcols=target_cols]
#              targetA           targetB
# 1: 12.60101574551183 7.585007905896557

但我不知道如何将两者结合起来;也就是说,计算包含指定字符串(&#34; target&#34;,在本例中)低于某个指定阈值(此处为10)的所有列中所有元素的平均值。这是我的第一个猜测,但没有成功:

exampleDT[.SD<examp_threshold,lapply(.SD,mean),.SDcols=target_cols]
#Empty data.table (0 rows) of 2 cols: targetA,targetB

1 个答案:

答案 0 :(得分:2)

您需要在j表达式中进行子集化,如下所示:

exampleDT[, lapply(.SD, function(x) mean(x[x<examp_threshold])),.SDcols=target_cols]

#   targetA targetB
#1: 9.224008 6.66624