gpt4 book ai didi

r - data.table 中的列表/多列分组条件中的列名

转载 作者:行者123 更新时间:2023-12-01 13:27:57 24 4
gpt4 key购买 nike

DT <- data.table(criteria=c("a","b","c","d","d","c","b","a"),
val1=1:8,
val2=c(-1,1,2,3,3,2,1,1),
val3=c(-3,2,0,3,3,0,2,3),
val4=c(5,3,2,1,1,2,3,-5),
val5=c(1,8,5,3,3,5,8,-1))

criteria val1 val2 val3 val4 val5
1: a 1 -1 -3 5 1
2: b 2 1 2 3 8
3: c 3 2 0 2 5
4: d 4 3 3 1 3
5: d 5 3 3 1 3
6: c 6 2 0 2 5
7: b 7 1 2 3 8
8: a 8 1 3 -5 -1

我想选择按列分组的行 criteria (执行值的 sum),列 val2val5等于零(以函数为标准的解决方案的加分点,因此不限于标准为 ==0 的情况)而不假设我事先知道列名。所以使用 colNames <- c('val2','val3','val4','val5')向量。

在上面的示例中,结果应该是第 1 行和第 8 行。

在我不使用额外标准的情况下,我可以这样做:

DT[DT[, Reduce(`|`, lapply(.SD, function(x){return(x==0)})), .SDcols = colNames]]

但我不知道如何添加额外的分组标准。

欢迎指点!

最佳答案

您是否有可能反对链接的具体原因?你可以这样做:

DT[, sum := sum(.SD), by= criteria, .SDcols = colNames][sum==0]

# criteria val1 val2 val3 val4 val5 sum
#1: a 1 -1 -3 5 1 0
#2: a 8 1 3 -5 -1 0

或者不使用链接,您通过分组来获取行,然后从 DT 中选择那些行:

DT[DT[, .I[sum(.SD)==0], by= criteria, .SDcols = colNames]$V1]

根据要求,如果你想在子集中使用通用函数,你可以这样做:

DT[DT[, .I[vapply(list(.SD), function(x) sum(x) == 0, logical(1))], by= criteria, .SDcols = colNames]$V1]

请务必注意,我使用了 vapply 以确保返回逻辑向量。您可以使用 sapplylapply 但您需要确保返回正确类型的向量,否则子集化将不起作用。我还使用了 list(.SD),这样它将一次对所有 .SD 执行 sum,而不是对每个单独的列执行 sum

关于r - data.table 中的列表/多列分组条件中的列名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47502969/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com