为了账号安全,请及时绑定邮箱和手机立即绑定

dplyr mutate rowSums计算或自定义函数

/ 猿问

dplyr mutate rowSums计算或自定义函数

慕运维8079593 2019-11-29 10:19:40

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


查看完整描述

3 回答

?
不负相思意

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


iris %>% mutate(sumVar = rowSums(.[1:4]))

如注释中所写,您还可以使用selectmutate内部来获取要汇总的列,例如


iris %>% 

  mutate(sumVar = rowSums(select(., contains("Sepal")))) %>% 

  head 

要么


iris %>% 

  mutate(sumVar = select(., contains("Sepal")) %>% rowSums()) %>% 

  head


查看完整回答
反对 2019-11-29
?
当年话下

我正在使用这个简单的解决方案,它是对Davide Passaretti的回答的更强大的修改:


iris %>% select(Sepal.Length:Petal.Width) %>%

  transmute(sumVar = rowSums(.)) %>% bind_cols(iris, .)

(但是,这需要定义的行顺序,这应该很好,除非您可能使用远程数据集。)


查看完整回答
反对 2019-11-29
?
蓝山帝景

您也可以使用grep代替containsor matches,以防万一您需要熟悉正则表达式(matches根据我的经验,这似乎不太像否定的前瞻之类)。


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


查看完整回答
反对 2019-11-29
  • 3 回答
  • 0 关注
  • 173 浏览

添加回答

回复

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信