2017-04-05 62 views
1

我有两个数据帧,它们都共享一个公共ID变量。然而,一个人有超过1000个观察值,而另一个有大约100个观察值。下面是他们看起来像的一个例子。如何合并两个不同大小的数据帧而不重复较小数据帧的情况,R

df1 = data.frame(Id = c(1,1,1,2,2,2,3,3,3), Type1 = 
    c(1,NA,NA,2,NA,NA,4,NA,NA), Type2= c(1,NA,NA,2,NA,NA,4,NA,NA)) 

    #df1 
    # Id Type1 Type2 
    # 1  1  1 
    # 1 NA NA 
    # 1 NA NA 
    # 2  2  2 
    # 2 NA NA 
    # 2 NA NA 
    # 3  4  4 
    # 3 NA NA 
    # 3 NA NA 



    df2 = data.frame(Id = c(1,2,3), Othertypes = c(5,4,6)) 


    #df2 
    # Id Othertypes 
    # 1   5 
    # 2   4 
    # 3   6 

当合并,案件在df12$Othertypes从更短的数据帧(DF2)被重复,因为这样:

 df12 <- merge(df1,df2, by ="Id") 

    #df12 
    # Id Type1 Type2 Othertypes 
    # 1  1  1   5 
    # 1 NA NA   5 
    # 1 NA NA   5 
    # 2  2  2   4 
    # 2 NA NA   4 
    # 2 NA NA   4 
    # 3  4  4   6 
    # 3 NA NA   6 
    # 3 NA NA   6 

不过,我真正想要的是每个ID 1 “Othertypes” 的情况下,作为这样的:

#df12 
    # Id Type1 Type2 Othertypes 
    # 1  1  1   5 
    # 1 NA NA   NA 
    # 1 NA NA   NA 
    # 2  2  2   4 
    # 2 NA NA   NA 
    # 2 NA NA   NA 
    # 3  4  4   6 
    # 3 NA NA   NA 
    # 3 NA NA   NA 

我曾尝试以下办法:

temp <- merge(df1,df2, by="Id",sort=FALSE) 
    temp2 <- left_join(df1, df2, by = "Id") 

以及data.table(非常失败)以及功能使用plyr(也不成功)。

回答

1

这里有一种方法使用match,*,[,和一点NA魔法。

df1$others <- df2$Othertypes[match(df1$Id, df2$Id)] * NA^is.na(df1$Type1) 

match返回与第二个参数匹配的第一个参数的位置。使用[ df $根据位置输出match重复Othertypes,因此df2$Othertypes[match(df1$Id, df2$Id)]会返回您使用merge获取的矢量。现在,这个向量乘以NA^is.na(df1$Type1),当df1$Type1是NA时返回NA,当它不是时,返回1。

这将返回

df1 
    Id Type1 Type2 others 
1 1  1  1  5 
2 1 NA NA  NA 
3 1 NA NA  NA 
4 2  2  2  4 
5 2 NA NA  NA 
6 2 NA NA  NA 
7 3  4  4  6 
8 3 NA NA  NA 
9 3 NA NA  NA 
0

您可以使用rbind

df1 = data.frame(Id = c(1,1,1,2,2,2,3,3,3), Type1 = 
        c(1,NA,NA,2,NA,NA,4,NA,NA), Type2= c(1,NA,NA,2,NA,NA,4,NA,NA)) 

df2 = data.frame(Id = c(1,2,3), Othertypes = c(5,4,6)) 

df1$Othertypes<-NA 
df2$Type1<-NA 
df2$Type2<-NA 

rbind(df1,df2) 

    Id Type1 Type2 Othertypes 
1 1  1  1   NA 
2 1 NA NA   NA 
3 1 NA NA   NA 
4 2  2  2   NA 
5 2 NA NA   NA 
6 2 NA NA   NA 
7 3  4  4   NA 
8 3 NA NA   NA 
9 3 NA NA   NA 
10 1 NA NA   5 
11 2 NA NA   4 
12 3 NA NA   6 
+0

这不起作用,因为所有ID必须具有“Othertypes”的值。在这种情况下,Ids 1-9没有任何价值。 –

0

试试这个

df1 = data.frame(Id = c(1,1,1,2,2,2,3,3,3), 
       Type1 = c(1,NA,NA,2,NA,NA,4,NA,NA), 
       Type2 = c(1,NA,NA,2,NA,NA,4,NA,NA)) 
df2 = data.frame(Id = c(1,2,3), Othertypes = c(5,4,6)) 

df12 = merge(df1,df2, by="Id") 
df12$Othertypes = ifelse(!duplicated(df12$Othertypes), df12$Othertypes, NA) 
0

我认为这个解决方案是DF2插入 “类型1” 栏目也然后按如下方式合并两列:

a<-df1$Type1 
a<-a[is.na(a)] 

df2$Type1<-a 

df12 <- merge(df1,df2, by =c("Id","Type1"),all.x=T) 
df12 
# Id Type1 Type2 Othertypes 
#1 1  1  1   5 
#2 1 NA NA   NA 
#3 1 NA NA   NA 
#4 2  2  2   4 
#5 2 NA NA   NA 
#6 2 NA NA   NA 
#7 3  4  4   6 
#8 3 NA NA   NA 
#9 3 NA NA   NA 
相关问题