dplyr - 使用正则表达式的多列的总和

时间:2017-09-07 05:11:29

标签: r dplyr tidyr tidyverse

对于数据集mtcars2

mtcars2 = mtcars
mtcars2 = mtcars2 %>% mutate(cyl9=cyl, disp9=disp, gear2=gear)

我希望通过使用正则表达式捕获模式来获得一个新列,即多列的总和。

这是一个解决方案,但这是通过硬编码

完成的
select(mtcars2, cyl9) + select(mtcars2, disp9) + select(mtcars2, gear2)

我试过这样的东西,但它给了我一个数字而不是一个矢量

mtcars2 %>% select(matches("[0-9]")) %>% sum

请仅使用dplyr解决方案,因为我需要稍后将这些函数应用于sql表。

谢谢!

更新.. 我需要解决方案来处理sql表,数据设置如下..

mydb <- dbConnect(RSQLite::SQLite(), "")
dbWriteTable(mydb, "mt", mtcars)
mt.sql=tbl(mydb, "mt")
mt.sql = mt.sql %>% mutate(cyl9=cyl, disp9=disp, gear2=gear)

reduce(),rowSums(),rowwise()在sql表上不起作用,我尝试过这些并且它们给我错误。

我试过了,

mt.sql %>% rowwise()

错误:is.data.frame(data)不为TRUE

mt.sql %>% select(matches("[0-9]")) %>% mutate(sum=rowSums(.))

UseMethod(“转义”)中的错误:   对于“c('tbl_dbi','tbl_sql','tbl_lazy','tbl')”对象的“逃逸”没有适用的方法“

mt.sql %>% select(matches("[0-9]")) %>% reduce(`+`)

.x + .y中的错误:二元运算符的非数字参数

如果我将mt.sql切换到mtcars2,它们都可以工作,所以我想这是一个sql表问题。

2 个答案:

答案 0 :(得分:1)

我们可以使用tidyverse选项

library(tidyverse)
mtcars2 %>%
      select(matches("[0-9]")) %>%
      reduce(`+`) #%>%
      #if needed to create a new column   
      #mutate(mtcars2, newcol = .)

#[1] 170.0 170.0 116.0 267.0 371.0 234.0 371.0 154.7 148.8 177.6 177.6 286.8
#[13] 286.8 286.8 483.0 471.0 451.0  86.7  83.7  79.1 127.1 329.0 315.0 361.0
#[25] 411.0  87.0 129.3 104.1 364.0 156.0 314.0 129.0

答案 1 :(得分:1)

考虑到SQL约束阻止使用更简单优雅的解决方案,例如rowSumsreduce,我提供了一个更黑客的答案,将我们带回到更基本的{{1} }

new_col = a + b + c + ... + n