双左加入 dplyr 以恢复值
Double left join in dplyr to recover values
我已经检查过这个问题,但找不到匹配的条目。
假设您有 2 个 DF:
df1:mode df2:sex
1 1
2 2
3
以及大部分组合都不存在的 DF3,例如
mode | sex | cases
1 1 9
1 1 2
2 2 7
3 1 2
1 2 5
你想用 dplyr 总结它获得所有组合(不存在的组合=0):
mode | sex | cases
1 1 11
1 2 5
2 1 0
2 2 7
3 1 2
3 2 0
如果您执行单个 left_join (left_join(df1,df3),您将恢复 df3 中没有的模式,但 'Sex' 显示为 'NA',并且同样,如果你做 left_join(df2,df3).
那么在 cases=0 的情况下,如何同时执行 left join 来恢复所有缺失的组合?首选 dplyr,但 sqldf 是一个选项。
提前致谢,p.
首先,这是一种更友好、可重现格式的数据
df1 <- data.frame(mode=1:3)
df2 <- data.frame(sex=1:2)
df3 <- data.frame(mode=c(1,1,2,3,1), sex=c(1,1,2,1,2), cases=c(9,2,7,2,5))
我在 dplyr
中没有看到完全外部联接的选项,所以我打算在这里使用 base R 合并 df1
和 df2
以获得所有mode/sex 组合。然后我将其加入数据并将 NA 值替换为零。
mm <- merge(df1,df2) %>% left_join(df3)
mm$cases[is.na(mm$cases)] <- 0
mm %>% group_by(mode,sex) %>% summarize(cases=sum(cases))
这给出了
mode sex cases
1 1 1 11
2 1 2 5
3 2 1 0
4 2 2 7
5 3 1 2
6 3 2 0
tidyr的开发版,tidyr_0.2.0.9000,有一个新的函数叫做complete
,我前几天看到的好像它就是为这种情况而制作的。
帮助页面说:
This is a wrapper around expand(), left_join() and replace_na that's
useful for completing missing combinations of data. It turns
implicitly missing values into explicitly missing values.
要添加 df3
的缺失组合并改为填充 0 值,您可以这样做:
library(tidyr)
library(dplyr)
df3 %>% complete(mode, sex, fill = list(cases = 0))
mode sex cases
1 1 1 9
2 1 1 2
3 1 2 5
4 2 1 0
5 2 2 7
6 3 1 2
7 3 2 0
您仍然需要 group_by
和 summarise
以获得您想要的最终输出。
df3 %>% complete(mode, sex, fill = list(cases = 0)) %>%
group_by(mode, sex) %>%
summarise(cases = sum(cases))
Source: local data frame [6 x 3]
Groups: mode
mode sex cases
1 1 1 11
2 1 2 5
3 2 1 0
4 2 2 7
5 3 1 2
6 3 2 0
我已经检查过这个问题,但找不到匹配的条目。
假设您有 2 个 DF:
df1:mode df2:sex
1 1
2 2
3
以及大部分组合都不存在的 DF3,例如
mode | sex | cases
1 1 9
1 1 2
2 2 7
3 1 2
1 2 5
你想用 dplyr 总结它获得所有组合(不存在的组合=0):
mode | sex | cases
1 1 11
1 2 5
2 1 0
2 2 7
3 1 2
3 2 0
如果您执行单个 left_join (left_join(df1,df3),您将恢复 df3 中没有的模式,但 'Sex' 显示为 'NA',并且同样,如果你做 left_join(df2,df3).
那么在 cases=0 的情况下,如何同时执行 left join 来恢复所有缺失的组合?首选 dplyr,但 sqldf 是一个选项。
提前致谢,p.
首先,这是一种更友好、可重现格式的数据
df1 <- data.frame(mode=1:3)
df2 <- data.frame(sex=1:2)
df3 <- data.frame(mode=c(1,1,2,3,1), sex=c(1,1,2,1,2), cases=c(9,2,7,2,5))
我在 dplyr
中没有看到完全外部联接的选项,所以我打算在这里使用 base R 合并 df1
和 df2
以获得所有mode/sex 组合。然后我将其加入数据并将 NA 值替换为零。
mm <- merge(df1,df2) %>% left_join(df3)
mm$cases[is.na(mm$cases)] <- 0
mm %>% group_by(mode,sex) %>% summarize(cases=sum(cases))
这给出了
mode sex cases
1 1 1 11
2 1 2 5
3 2 1 0
4 2 2 7
5 3 1 2
6 3 2 0
tidyr的开发版,tidyr_0.2.0.9000,有一个新的函数叫做complete
,我前几天看到的好像它就是为这种情况而制作的。
帮助页面说:
This is a wrapper around expand(), left_join() and replace_na that's useful for completing missing combinations of data. It turns implicitly missing values into explicitly missing values.
要添加 df3
的缺失组合并改为填充 0 值,您可以这样做:
library(tidyr)
library(dplyr)
df3 %>% complete(mode, sex, fill = list(cases = 0))
mode sex cases
1 1 1 9
2 1 1 2
3 1 2 5
4 2 1 0
5 2 2 7
6 3 1 2
7 3 2 0
您仍然需要 group_by
和 summarise
以获得您想要的最终输出。
df3 %>% complete(mode, sex, fill = list(cases = 0)) %>%
group_by(mode, sex) %>%
summarise(cases = sum(cases))
Source: local data frame [6 x 3]
Groups: mode
mode sex cases
1 1 1 11
2 1 2 5
3 2 1 0
4 2 2 7
5 3 1 2
6 3 2 0