汇总所有列

Kon*_*lph 10 r summarization dplyr

我有以下格式的数据:

gen = function () sample.int(10, replace = TRUE)
x = data.frame(A = gen(), C = gen(), G = gen(), T = gen())
Run Code Online (Sandbox Code Playgroud)

我现在想要在每行中附加行中所有元素的总和(我的实际函数更复杂,但sum说明了问题).

没有dplyr,我会写

cbind(x, Sum = apply(x, 1, sum))
Run Code Online (Sandbox Code Playgroud)

导致:

   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
…
Run Code Online (Sandbox Code Playgroud)

但用dplyr做这件事似乎很难.

我试过了

x %>% rowwise() %>% mutate(Sum = sum(A : T))
Run Code Online (Sandbox Code Playgroud)

但结果不是每一行的总和,这是意想不到的东西,(对我来说)莫名其妙.

我也试过了

x %>% rowwise() %>% mutate(Sum = sum(.))
Run Code Online (Sandbox Code Playgroud)

但在这里,.它只是整个 占位符x.毫无疑问,不提供任何论据也不起作用(结果都是如此0).毋庸置疑,这些变体都没有rowwise().

(在dplyr中没有任何理由必须这样做,但是(a)我希望尽可能保持我的代码统一,并且在不同的API之间跳转没有帮助;并且(b)我希望有一天在dplyr中获得这些命令的自动和自由并行化.)

Hen*_*rik 5

我曾经做过类似的事情,到那时我最终得到了:

x %>%
  rowwise() %>%
  do(data.frame(., res = sum(unlist(.))))
#    A  C G  T res
# 1  3  2 8  6  19
# 2  6  1 7 10  24
# 3  4  8 6  7  25
# 4  6  4 7  8  25
# 5  6 10 7  2  25
# 6  7  1 2  2  12
# 7  5  4 8  5  22
# 8  9  2 3  2  16
# 9  3  4 7  6  20
# 10 7  5 3  9  24
Run Code Online (Sandbox Code Playgroud)

也许你的更复杂的功能可以正常工作unlist,但似乎它是必要的sum.因为.引用"当前组",我最初认为,.例如机器中的第一行rowwise对应于x[1, ],这是一个列表,sum在外面快乐地吞下do

is.list((x[1, ]))
# [1] TRUE

sum(x[1, ])
# [1] 19 
Run Code Online (Sandbox Code Playgroud)

但是,如果没有unlistdo一个错误的产生,我不知道为什么:

x %>%
  rowwise() %>%
  do(data.frame(., res = sum(.)))
# Error in sum(.) : invalid 'type' (list) of argument
Run Code Online (Sandbox Code Playgroud)


And*_*lor 3

这能达到你想要的效果吗?

Data %>%
   mutate(SumVar=rowSums(.))
Run Code Online (Sandbox Code Playgroud)