合并具有相同行的两个数据表将导致NA

时间:2015-04-21 13:39:27

标签: r merge

我有两个数据表,比方说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

3 个答案:

答案 0 :(得分:0)

在这种情况下,我更倾向于使用rbind函数,因为这不是merge

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

编辑: 对不起,我误解了这个问题。如果存在重复的条目,您可能想要尝试left_join包中的full_joindplyr功能。

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

答案 1 :(得分:0)

过滤要添加的行后,可以使用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)

答案 2 :(得分:0)

解决!非常愚蠢但很难注意到。 DT1 $ Tienda的每一行最后都有一个空格