如何从ave中的函数调用非x?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何从ave中的函数调用非x?相关的知识,希望对你有一定的参考价值。

我有一些数据,我想为这些数据计算具有相同ID的所有行的总'数据'减去不共享相同ID的所有行的总'数据'。目前我已经找到第一部分(见代码),但不是第二部分。有没有人知道如何在ave内的函数中调用所有非x?

示例数据:

 group_ID_dets <- data.table("group_ID" = rep(c(1,2), 2), "n_IDS" = 1:4, "data"= c(1,5,10,100))

我的第1部分代码:

 group_ID_dets$totals <- ave(group_ID_dets$data, group_ID_dets$group_ID, FUN = function(x) sum(x))

我希望将其作为输出:

   group_ID n_IDS data totals
1:        1     1    1      0
2:        2     2    5     94
3:        1     3   10      0
4:        2     4  100     94
答案

它非常草率,但使用数据表计算j表达式的方式,您可以执行以下操作:

group_ID_dets[, .(n_IDS, data, totals = max(c(2* sum(data) - sum(group_ID_dets$data), 0))), by = group_ID]

这使用DT[i, j, by]格式,其中j表达式

.(n_IDS, data, totals = max(c(2* sum(data) - sum(group_ID_dets$data), 0)))

j表达式表示我们将包含n_IDS列和数据列,然后我们将计算按group_ID列分组的总计列。

data.table评估是针对分组变量的,但是我们可以使用data.frame提取来提取整个列的总数并退出分组。所以sum(group_ID_dets$data)仍然评估整个总和。然后我们可以使用以下等式:a - sum(b,c,...)= a + a - (a + sum(b,c,...))= 2 * a - sum(a,b, C, ...)。根据您想要的输出,我们将负值保持为0。

   group_ID n_IDS data totals
1:        1     1    1      0
2:        1     3   10      0
3:        2     2    5     94
4:        2     4  100     94

以上是关于如何从ave中的函数调用非x?的主要内容,如果未能解决你的问题,请参考以下文章

从活动中调用片段中的非静态方法?

如何将数据从回收器适配器发送到片段 |如何从 recyclerview 适配器调用片段函数

如何从Android中没有活动和片段的函数调用DialogFragment?

如何让片段中的多个视图调用片段类中声明的相同 onClick 函数?

如何从cordova 3.x调用本机函数

调用模板化成员函数:帮助我理解另一个 *** 帖子中的代码片段