如何使用列索引与dplyr对选定列进行行向求和?

时间:2015-07-02 19:31:51

标签: r 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
..     ...  ...          ...         ...          ...         ...

有更多的语法更好的方法来实现这一目标吗?

编辑:它与其他问题不同,因为我想对使用列索引选择的列进行逐行操作"

4 个答案:

答案 0 :(得分:10)

正如评论中已经说过的那样,您可以通过以下方式完成任务:

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

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

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

答案 1 :(得分:1)

你可以(ab)使用基础R subset,它允许按编号选择列:

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

答案 2 :(得分:0)

不确定这是不是正确的礼仪,但我更喜欢回收这个帖子,而不是开始给出一个新的帖子,我很确定,我只是犯了一个菜鸟错误。

为什么这样做正常:

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(逻辑)1。 ncol(。)= 33。

答案 3 :(得分:0)

我认为执行行操作的能力是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)进行更广义化(但如果计算中不包含某些数字变量,则无效)。