【发布时间】:2015-03-21 15:26:30
【问题描述】:
我有以下格式的数据:
gen = function () sample.int(10, replace = TRUE)
x = data.frame(A = gen(), C = gen(), G = gen(), T = gen())
我现在想将行中所有元素的总和附加到每一行(我的实际函数更复杂,但sum 说明了问题)。
没有 dplyr,我会写
cbind(x, Sum = apply(x, 1, sum))
导致:
A C G T Sum
1 3 1 6 9 19
2 3 4 3 3 13
3 3 1 10 5 19
4 7 2 1 6 16
…
但是用 dplyr 来做这件事似乎非常困难。
我试过了
x %>% rowwise() %>% mutate(Sum = sum(A : T))
但结果不是每一行的列的总和,这是出乎意料的,(对我来说)莫名其妙。
我也试过
x %>% rowwise() %>% mutate(Sum = sum(.))
但在这里,. 只是整个 x 的占位符。不出所料,提供 no 参数也不起作用(结果都是0)。不用说,如果没有 rowwise(),这些变体都无法工作。
(实际上没有任何理由必须在 dplyr 中执行此操作,但是 (a) 我希望我的代码尽可能统一,并且在不同 API 之间跳转没有帮助;并且 (b) 我'我希望有一天能在 dplyr 中自动和免费地并行化此类命令。)
【问题讨论】:
-
如果 sum 只是为了说明,它可能是一个糟糕的选择,因为有一个特殊的功能,如下面的答案所示。对于其他功能,收集您感兴趣的列,计算您感兴趣的值然后传播(例如使用 tidyr)可能更像 dplyr。至少这是我的解释..
-
我想知道像
library(data.table) ; setDT(x)[, Sum := Reduce("+", .SD)][]这样的人是否有用... -
@DavidArenburg,很好的方法,它与 dplyr 的工作方式相同。您将如何将它与不同的功能一起使用,例如我的答案中的那个? (我认为不同之处在于
+是一个二进制函数,接受2 个输入,然后可以多次应用/减少,而我的答案中的f一次接受整个向量..) -
@docendodiscimus,这就是我在 cmets 中发布此内容的原因。我们没有 Konrads 真正的功能,因此它也可能与
Reduce一起使用。会等着看他说什么。 -
@DavidArenburg,当然 - 了解更多有关函数输入/输出设计的信息肯定会很有趣。
标签: r dplyr summarization