2017-04-05 105 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 
相關問題