对于数据集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表问题。
答案 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约束阻止使用更简单优雅的解决方案,例如rowSums
和reduce
,我提供了一个更黑客的答案,将我们带回到更基本的{{1} }
new_col = a + b + c + ... + n