在@akrun看到this post得到一个很好的答案之后,我想和dplyr
一起玩。以下是帖子和akrun的示例数据。
df = data.frame(
id1 = c(1,1,2,2,2,3,3,3,3),
id2 = c(1,2,1,2,3,1,2,3,4),
X1 = letters[1:9],
X2 = LETTERS[1:9],
stringsAsFactors = FALSE
)
df2 <- data.frame(
id1 = rep(c(1:3), each = 4),
id2 = rep(c(1:4), times = 3),
stringsAsFactors = FALSE
)
如果我复制akrun的答案,merge()
完全适用于此。
df %>%
do(merge(., df2, by = c("id1","id2"), all = TRUE))
id1 id2 X1 X2
1 1 1 a A
2 1 2 b B
3 1 3 <NA> <NA>
4 1 4 <NA> <NA>
5 2 1 c C
6 2 2 d D
7 2 3 e E
8 2 4 <NA> <NA>
9 3 1 f F
10 3 2 g G
11 3 3 h H
12 3 4 i I
然后,我认为left_join(x,y)
会这样做。 left_join(x,y)
包含x
的所有内容以及y
的匹配行。从UseR!2014的dplyr
教程pdf中的示例中,我期望得到相同的结果。但是,事实并非如此。
> df %>%
+ left_join(df2, .)
Joining by: c("id1", "id2")
id1 id2 X1 X2
1 1 1 a A
2 1 2 b B
3 1 3 <NA> <NA>
4 1 4 <NA> <NA>
5 2 1 <NA> <NA>
6 2 2 <NA> <NA>
7 2 3 <NA> <NA>
8 2 4 <NA> <NA>
9 3 1 <NA> <NA>
10 3 2 <NA> <NA>
11 3 3 <NA> <NA>
12 3 4 <NA> <NA>
前三行表明dplyr
正在做正确的工作。但是,一旦遇到NA
,它就会生成NA
直到结束。这是一个错误还是我做错了什么?感谢您抽出宝贵时间。
答案 0 :(得分:1)
目前有一些错误包含dplyr
和_join
功能:
我看起来他们正在被修复。同时,如果你确定分组变量是相同的类型(它们不在你的例子中 - 你可以使用str()
告诉),那么它应该有效:
df = data.frame(
id1 = c(1,1,2,2,2,3,3,3,3),
id2 = c(1,2,1,2,3,1,2,3,4),
X1 = letters[1:9],
X2 = LETTERS[1:9],
stringsAsFactors = FALSE
)
df2 <- data.frame(
id1 = as.numeric(rep(c(1:3), each = 4)),
id2 = as.numeric(rep(c(1:4), times = 3)),
stringsAsFactors = FALSE
)
left_join(df2, df)