【问题标题】:Apply function to subset elements that satisfy a criteria across subset of columns in data.table将函数应用于满足跨 data.table 中列子集的条件的子集元素
【发布时间】:2026-01-06 04:00:01
【问题描述】:

考虑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

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

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

【问题讨论】:

    标签: r data.table


    【解决方案1】:

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

    exampleDT[, lapply(.SD, function(x) mean(x[x<examp_threshold])),.SDcols=target_cols]
    
    #   targetA targetB
    #1: 9.224008 6.66624
    

    【讨论】:

    • 完美!非常感谢!
    最近更新 更多