我正在尝试从行计算中改变一个新变量,
说rowSums
如下
iris %>%
mutate_(sumVar =
iris %>%
select(Sepal.Length:Petal.Width) %>%
rowSums)
结果是“sumVar”被截断为其第一个值(10.2):
Source: local data frame [150 x 6]
Groups: <by row>
Sepal.Length Sepal.Width Petal.Length Petal.Width Species sumVar
1 5.1 3.5 1.4 0.2 setosa 10.2
2 4.9 3.0 1.4 0.2 setosa 10.2
3 4.7 3.2 1.3 0.2 setosa 10.2
4 4.6 3.1 1.5 0.2 setosa 10.2
5 5.0 3.6 1.4 0.2 setosa 10.2
6 5.4 3.9 1.7 0.4 setosa 10.2
..
Warning message:
Truncating vector to length 1
是否应该rowwise
?或者在这些计算中使用什么是正确的动词。
修改
更具体地说,有没有办法用dplyr
实现内联自定义功能?
我想知道是否有可能做类似的事情:
iris %>%
mutate(sumVar = colsum_function(Sepal.Length:Petal.Width))
答案 0 :(得分:94)
这是一种解决方法,但可以使用
iris %>% mutate(sumVar = rowSums(.[1:4]))
如评论中所述,您还可以使用mutate中的select
来获取您想要总结的列,例如
iris %>%
mutate(sumVar = rowSums(select(., contains("Sepal")))) %>%
head
或
iris %>%
mutate(sumVar = select(., contains("Sepal")) %>% rowSums()) %>%
head
答案 1 :(得分:12)
更复杂的方式是:
iris %>% select(Sepal.Length:Petal.Width) %>%
mutate(sumVar = rowSums(.)) %>% left_join(iris)
答案 2 :(得分:6)
您可以使用rowwise()
功能:
iris %>%
rowwise() %>%
mutate(sumVar = sum(c_across(Sepal.Length:Petal.Width)))
#> # A tibble: 150 x 6
#> # Rowwise:
#> Sepal.Length Sepal.Width Petal.Length Petal.Width Species sumVar
#> <dbl> <dbl> <dbl> <dbl> <fct> <dbl>
#> 1 5.1 3.5 1.4 0.2 setosa 10.2
#> 2 4.9 3 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 3.6 1.4 0.2 setosa 10.2
#> 6 5.4 3.9 1.7 0.4 setosa 11.4
#> 7 4.6 3.4 1.4 0.3 setosa 9.7
#> 8 5 3.4 1.5 0.2 setosa 10.1
#> 9 4.4 2.9 1.4 0.2 setosa 8.9
#> 10 4.9 3.1 1.5 0.1 setosa 9.6
#> # ... with 140 more rows
“ c_across()
使用整洁的选择语法,因此您可以简洁地选择许多变量”'
最后,如果需要的话,可以在末尾使用%>% ungroup
从行退出。
答案 3 :(得分:5)
添加@ docendodiscimus的评论作为答案。给他+1!
iris %>% mutate(sumVar = rowSums(select(., contains("Sepal"))))
答案 4 :(得分:1)
我正在使用这个简单的解决方案,这是Davide Passaretti对答案的更强有力的修改:
iris %>% select(Sepal.Length:Petal.Width) %>%
transmute(sumVar = rowSums(.)) %>% bind_cols(iris, .)
(但它需要一个定义的行顺序,这应该没问题,除非你使用远程数据集......)
答案 5 :(得分:1)
您也可以使用grep代替contains
或matches
,以防万一您需要看上正则表达式(matches
看起来不太像负数在我的经历中是超前的等等。
iris %>% mutate(sumVar = rowSums(select(., grep("Sepal", names(.)))))