如何使用带有 dplyr 的列索引对选定的列进行按行求和?

How to do rowwise summation over selected columns using column index with dplyr?

dplyr中,如何对选定的列执行按行求和(使用列索引)?

这行不通

> iris  %>% mutate(sum=sum(.[1:4])) %>% head
  Sepal.Length Sepal.Width Petal.Length Petal.Width Species    sum
1          5.1         3.5          1.4         0.2  setosa 2078.7
2          4.9         3.0          1.4         0.2  setosa 2078.7
3          4.7         3.2          1.3         0.2  setosa 2078.7
4          4.6         3.1          1.5         0.2  setosa 2078.7
5          5.0         3.6          1.4         0.2  setosa 2078.7
6          5.4         3.9          1.7         0.4  setosa 2078.7

下面的我可以,但是不漂亮

> iris %>% mutate(index=1:n()) %>%  
                gather("param", "value", 1:4)  %>% 
                group_by(index) %>% 
                mutate(sum=sum(value)) %>% 
                spread(param, value) %>% select(-index)
Source: local data frame [150 x 6]

   Species  sum Sepal.Length Sepal.Width Petal.Length Petal.Width
1   setosa 10.2          5.1         3.5          1.4         0.2
2   setosa  9.5          4.9         3.0          1.4         0.2
3   setosa  9.4          4.7         3.2          1.3         0.2
4   setosa  9.4          4.6         3.1          1.5         0.2
5   setosa 10.2          5.0         3.6          1.4         0.2
6   setosa 11.4          5.4         3.9          1.7         0.4
7   setosa  9.7          4.6         3.4          1.4         0.3
8   setosa 10.1          5.0         3.4          1.5         0.2
9   setosa  8.9          4.4         2.9          1.4         0.2
10  setosa  9.6          4.9         3.1          1.5         0.1
..     ...  ...          ...         ...          ...         ...

有没有语法上更好的方法来实现这个?

编辑:这与其他问题不同,因为我想对使用列索引

选择的列进行按行操作

您可以(ab)使用基数 R 的 subset,它允许按数字选择列:

iris %>% subset(select=1:4) %>% mutate(sum=rowSums(.))

如评论中所述,您可以通过以下方式完成任务:

iris %>% mutate(sum=Reduce("+",.[1:4]))

在这种情况下,基础 rowSums 也有效:

iris$sum<-rowSums(iris[,1:4])

不确定这是正确的礼节,但我更愿意回收这个线程而不是开始一个新的线程,我很确定,我只是犯了一个菜鸟错误。

为什么这个工作正常:

test$sum <- Reduce("+", test[,3:ncol(test)])

而这(对我来说是一样的)不是吗?

test %>%
  mutate(sum = Reduce("+",.[3:ncol(.)]))

给出的错误是

Error in mutate_impl(.data, dots) : 
  Column `sum` must be length 1 (the group size), not 915

我从 30 岁左右开始就用头撞桌子!

我希望我能给你底层数据集,但我真的不能。

列 1:2 是文本字段,而 3:ncol(.) 是 TRUE/FALSE(逻辑)字段。 ncol(.) = 33.

我认为进行逐行操作的能力是 tidyverse 语法的一个弱点,但是 purrr:pmap_* 对 运行 这一点很有用,尽管不是那么明显:

iris %>% 
  mutate(total = pmap_dbl(select(., -Species), sum))

    Sepal.Length Sepal.Width Petal.Length Petal.Width    Species  total
1            5.1         3.5          1.4         0.2     setosa  10.2
2            4.9         3.0          1.4         0.2     setosa   9.5
3            4.7         3.2          1.3         0.2     setosa   9.4
4            4.6         3.1          1.5         0.2     setosa   9.4
5            5.0         3.6          1.4         0.2     setosa  10.2

或者,您可以使用 select_if(., is.numeric) 而不是 select(., -Species) 来更通用(但如果有一些您不希望包含在计算中的数字变量,它将不起作用)。