我将用一个例子来说明我的问题。
示例数据:
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/