data.table merge(),NA按列

时间:2019-01-18 14:15:10

标签: r data.table

我正在尝试联接两个表,其中联接的列具有一些NA值,以便在遇到NA时,用NA填充记录,即

给出:

> x = data.table(c(1,2,3,NA,5), c("a","b","c","d","e"))
> x
   V1 V2
1:  1  a
2:  2  b
3:  3  c
4: NA  d
5:  5  e

> y = data.table(c(NA,2,3,4,5), c("A","B","C","D","E"))
> y
   V1 V2
1: NA  A
2:  2  B
3:  3  C
4:  4  D
5:  5  E

我希望我的输出是:

> z = data.table(c(NA,NA,1,2,3,4,5),c("d",NA,"a","b","c",NA,"e"),c(NA,"A",NA,"B","C","D","E"))
> z
   V1 V2 V3
1: NA  d NA
2: NA NA  A
3:  1  a NA
4:  2  b  B
5:  3  c  C
6:  4 NA  D
7:  5  e  E

我认为可以使用merge()来做到这一点。但是我无法获得期望的输出结果

> merge(x,y, by=c("V1"), all=TRUE)
   V1 V2.x V2.y
1: NA    d    A
2:  1    a   NA
3:  2    b    B
4:  3    c    C
5:  4   NA    D
6:  5    e    E 

我真的不喜欢它根据NA值进行合并,就好像它是一个匹配项,并且当我在具有多个NA的较大表中进行此操作时,似乎遍历了V1列值的所有可能组合和V2提供了NA键。任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:7)

merge的dataframe方法具有一个incomparables参数,而merge的{​​{3}}版本则没有。

因此,使用dataframe方法:

merge.data.frame(x, y, by = "V1", all = TRUE, incomparables = NA)

达到预期的结果:

  V1 V2.x V2.y
1  1    a <NA>
2  2    b    B
3  3    c    C
4  4 <NA>    D
5  5    e    E
6 NA    d <NA>
7 NA <NA>    A

注意:According to this GitHub-issue开发人员计划将来在incomparables中包含一个merge.data.table参数。