dplyr mutate rowSums计算或自定义函数

leo*_*uyi 54 r dplyr

我试图从行计算中改变一个新变量,rowSums如下所示

iris %>% 
  mutate_(sumVar = 
            iris %>% 
            select(Sepal.Length:Petal.Width) %>%
            rowSums)
Run Code Online (Sandbox Code Playgroud)

结果是"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 
Run Code Online (Sandbox Code Playgroud)

它应该rowwise适用吗?或者在这些计算中使用什么是正确的动词.

编辑:

更具体地说,是否有任何方法可以实现内联自定义功能dplyr

我想知道是否有可能做类似的事情:

iris %>% 
  mutate(sumVar = colsum_function(Sepal.Length:Petal.Width))
Run Code Online (Sandbox Code Playgroud)

tal*_*lat 103

这是一种解决方法,但可以使用

iris %>% mutate(sumVar = rowSums(.[1:4]))
Run Code Online (Sandbox Code Playgroud)

正如在注释中所写,您也可以使用selectmutate内部来获取您想要总结的列

iris %>% 
  mutate(sumVar = rowSums(select(., contains("Sepal")))) %>% 
  head 
Run Code Online (Sandbox Code Playgroud)

要么

iris %>% 
  mutate(sumVar = select(., contains("Sepal")) %>% rowSums()) %>% 
  head
Run Code Online (Sandbox Code Playgroud)

  • @Konrad,你可以做类似`iris%>%mutate(sumVar = rowSums(select(.,contains("Sepal"))))%>%head`或`iris%>%mutate(sumVar = select(. ,contains("Sepal"))%>%rowSums())%>%head` (12认同)
  • 如果它对任何人都有用,我之所以收到错误`is.data.frame(x):object'.没找到`是因为我有一个旧版本的`magrittr`.当我从`magrittr_1.0.1`更新为`magrittr_1.5`时,一切正常. (3认同)
  • @docendodiscimus的评论确实应该是另一个(可投票的)答案.它是最强大的dplyr-esque解决方案. (2认同)

Dav*_*tti 12

更复杂的方式是:

 iris %>% select(Sepal.Length:Petal.Width) %>%
mutate(sumVar = rowSums(.)) %>% left_join(iris)
Run Code Online (Sandbox Code Playgroud)


HBa*_*Bat 11

您可以使用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
Run Code Online (Sandbox Code Playgroud)

"c_across()使用整洁的选择语法,因此您可以简洁地选择许多变量"'

最后,如果你愿意,你可以%>% ungroup在最后使用从 rowwise 退出。

  • 对于像“sum”这样的操作,已经有了高效的向量化逐行替代方案,目前正确的方法是:“df %&gt;% mutate(total = rowSums(across(where(is.numeric))))”“across”可以采取 `select` 可以的任何内容(例如 `rowSums(across(Sepal.Length:Petal.Width))` 也可以)。向下滚动[行方向](https://dplyr.tidyverse.org/articles/rowwise.html)小插图以找到此内容并查看[跨](https://dplyr.tidyverse.org/reference/跨.html) (16认同)

psy*_*ics 5

添加@ docendodiscimus的评论作为答案.+1给他!

iris %>% mutate(sumVar = rowSums(select(., contains("Sepal"))))
Run Code Online (Sandbox Code Playgroud)