我将用一个例子来说明我的问题.

样本数据:

 df <- data.frame(ID = c(1, 1, 2, 2, 3, 5), A = c("foo", "bar", "foo", "foo", "bar", "bar"), B =     c(1, 5, 7, 23, 54, 202))

df
  ID   A   B
1  1 foo   1
2  1 bar   5
3  2 foo   7
4  2 foo  23
5  3 bar  54
6  5 bar 202

我想做的是,通过ID,总结出B的和,当A是"foo"时,B的和.我可以通过以下几个步骤来实现:

require(magrittr)
require(dplyr)

df1 <- df %>%
  group_by(ID) %>%
  summarize(sumB = sum(B))

df2 <- df %>%
  filter(A == "foo") %>%
  group_by(ID) %>%
  summarize(sumBfoo = sum(B))

left_join(df1, df2)

  ID sumB sumBfoo
1  1    6       1
2  2   30      30
3  3   54      NA
4  5  202      NA

然而,我正在寻找一种更优雅/更快的方法,因为我正在处理sqlite中10gb+的内存不足数据.

require(sqldf)
my_db <- src_sqlite("my_db.sqlite3", create = T)
df_sqlite <- copy_to(my_db, df)

我想用mutate来定义一个新的Bfoo列:

df_sqlite %>%
  mutate(Bfoo = ifelse(A=="foo", B, 0))

不幸的是,这在数据库端不起作用.

Error in sqliteExecStatement(conn, statement, ...) : 
  RS-DBI driver: (error in statement: no such function: IFELSE)

推荐答案

写下@hadley的 comments 作为答案

df_sqlite %>%
  group_by(ID) %>%
  mutate(Bfoo = if(A=="foo") B else 0) %>%
  summarize(sumB = sum(B),
            sumBfoo = sum(Bfoo)) %>%
  collect

R相关问答推荐

是否可以通过另一个DF的内容过滤数据帧列表?

高质量地将R格式的图表从Word中输出

在边界外添加注释或标题

带有gplot 2的十字舱口

警告:lmdif:info = 0. nls. lm()函数的输入参数不正确

将向量组合到一个数据集中,并相应地命名行

在R中使用download. file().奇怪的URL?

根据日期从参考帧中创建不同的帧

Select 季度月值

用R ggplot2求上、下三角形中两个变量的矩阵热图

计算直线上点到参考点的总距离

在另一个包中设置断点&S R函数

在R中使用列表(作为tibble列)进行向量化?

我是否可以使用多个变异项来构建顺序列(标记多个问题)

Conditional documentr::R中数据帧的summarize()

如何在R中创建条形图,使条形图在y轴上围绕0.5而不是0构建条形图?

如何调整一个facet_work()面板内的框图和移动标签之间的水平宽度?

GOGPLATE geom_boxploy色彩疯狂

隐藏基于 case 总数的值

有没有办法将勾选/审查标记添加到R中的累积关联图中?