left_join(x,y)和NA

时间:2014-09-12 17:34:34

标签: r dplyr

在@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直到结束。这是一个错误还是我做错了什么?感谢您抽出宝贵时间。

1 个答案:

答案 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)