如何使用带有 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)
来更通用(但如果有一些您不希望包含在计算中的数字变量,它将不起作用)。
在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)
来更通用(但如果有一些您不希望包含在计算中的数字变量,它将不起作用)。