【问题标题】:Merge two data tables with the same rows result in NA合并具有相同行的两个数据表结果为 NA
【发布时间】:2015-06-28 17:05:45
【问题描述】:

我有两个数据表,比如说 DT1 和 DT2:

> head(DT1)
   Tienda  Codigo 
1: Abasto 8519202  
2: Abasto 8610301
3: Abasto 8908001 
4: Abasto 8911602  
5: Abasto 8948801 
6: Abasto 41004301 

> head(DT2)
    Tienda   Codigo SemanaIntro
1: Abasto  43055201          30
2: Abasto  43055202          30
3: Abasto  43055203          30
4: Abasto   8785701          38
5: Abasto  41013401          38
6: Abasto  41129602          39

同班:

> class(DT1$Tienda)
[1] "factor"
> class(DT2$Tienda)
[1] "factor"
> class(DT1$Codigo)
[1] "integer"
> class(DT2$Codigo)
[1] "integer"

我想做一个合并,有些行匹配,有些不匹配

> DT3 <- merge(DT1,DT2,by = c("Tienda","Codigo"), all.x = T)
   Tienda Codigo SemanaIntro
1: Abasto      0          NA
2: Abasto      0          NA
3: Abasto 733501          NA
4: Abasto 733501          NA
5: Abasto 733501          NA
6: Abasto 845402          NA

SemanaIntro 列的每一行都是 NA,它们存在于两个数据表中。 DT2 中没有重复的行。 DT1 有 35M 的观测值,可能问题与此有关。

有什么想法吗? 谢谢!

编辑: 这是一个例子。

> DT1
   Tienda  Codigo 
1: Abasto       1  
2: Abasto       1
3: Abasto       3 
4: Zurich       3  
5: Zurich       3 
6: Zurich       7 

> DT2
  Tienda   Codigo SemanaIntro
1: Abasto       1          1
2: Abasto       2          1
3: Abasto       3          1
4: Zurich       3          2
5: Zurich       5          3
6: Zurich       6          3

> DT3 
   Tienda  Codigo SemanaIntro
1: Abasto       1           1
2: Abasto       1           1
3: Abasto       3           1
4: Zurich       3           2
5: Zurich       3           2
6: Zurich       7          NA

【问题讨论】:

    标签: r merge


    【解决方案1】:

    解决了!非常愚蠢的事情,但很难注意到。 DT1$Tienda 每一行末尾都有一个空格

    【讨论】:

      【解决方案2】:

      您可以在过滤要添加的行之后使用 rbind.fill(在 plyr 包中)。

      DT1$ID <- paste(DT1$Tienda, DT1$Codigo, sep="_")
      DT2$ID <- paste(DT2$Tienda, DT2$Codigo, sep="_")
      
      not.in.TD2 <- ! DT1$ID %in% DT2$ID
      
      require("plyr")
      DT3 <- rbind.fill(DT1[not.in.TD2,], DT2)
      

      在这种情况下,您可以避免使用 rbind.fill 并执行以下操作:

      DT1$SemanaIntro <- NA 
      rbind(DT1[not.in.TD2,], DT2)
      

      【讨论】:

      • 我认为这样做会丢失 DT1 的重复值(在 DT2 中没有重复)
      • 你能说明你想做什么吗?也许举一个 TD1 和 TD2 的小例子,以及你对 TD3 的期望。
      • 我要做的是合并会做的事情,但不起作用。我已经用一个例子编辑了它
      【解决方案3】:

      在这种情况下,我更喜欢使用rbind 函数,因为这不是真正的merge

      DT1$SemanaIntro<-NA
      DT3<-rbind(DT1, DT2)
      

      编辑: 对不起,我误解了这个问题。如果有重复的条目,您可能想尝试dplyr 包中的left_joinfull_join 函数。

      library(dplyr)
      DT3<-full_join(DT1, DT2, by="Codigo")
      

      【讨论】:

      • 行不相等是行不通的,但是谢谢你的回答
      • 它应该可以工作,但它没有:(。我获得了相同的 NA 列。
      • left_join(DT1, DT2)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-03-24
      • 1970-01-01
      • 2019-01-21
      • 2020-12-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多