dplyr mutate rowSums计算或自定义函数

时间:2014-12-08 09:15:09

标签: r dplyr

我正在尝试从行计算中改变一个新变量, 说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))

6 个答案:

答案 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代替containsmatches,以防万一您需要看上正则表达式(matches看起来不太像负数在我的经历中是超前的等等。

iris %>% mutate(sumVar = rowSums(select(., grep("Sepal", names(.)))))