r - 在同一调用中汇总所有组值和条件子集

标签 r dplyr sqldf

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

示例数据:

 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)

最佳答案

您可以在单个 dplyr 语句中进行这两项求和:

df1 <- df %>%
  group_by(ID) %>%
  summarize(sumB = sum(B),
            sumBfoo = sum(B[A=="foo"]))

这是一个 data.table 版本:

library(data.table)

dt = setDT(df) 

dt1 = dt[ , .(sumB = sum(B),
              sumBfoo = sum(B[A=="foo"])), 
          by = ID]

dt1
   ID sumB sumBfoo
1:  1    6       1
2:  2   30      30
3:  3   54       0
4:  5  202       0

关于r - 在同一调用中汇总所有组值和条件子集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23528862/

相关文章:

r - 按组从前一行减去值

r - 将特定列中每一行的值转换为该特定列中特定行的值的百分比

r - 使用查找向量替换变量中的字符串

r - 在 R 中建立家庭嵌套树父/子关系

r - R : attempt to set 'colnames' on an object with less than two dimensions中的错误消息

r - 如何在 ggplot2 图中有两个源标题?

sql - 如果限于本地机器,最好使用 R 和 SQL

sql - 连接文本文件并将它们导入 SQLite DB

regex - 消除句点前的空格,除非后跟一个数字

r - 在 R 中将函数迭代应用到它自己的结果