如何合并两个不同大小的数据帧而不重复R中较小数据帧的情况

时间:2017-04-05 16:21:23

标签: r dataframe merge

我有两个数据框,两个数据框共享一个公共ID变量。然而,一个有超过1000个观察,而另一个有大约100.下面是它们的样子的一个例子。

    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

合并时,重复较短数据框(df2)中df12$Othertypes的情况,如下:

     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

然而,我真正想要的是1&#34; Othertypes&#34;每个Id的案例,如此:

    #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的功能(也不成功)之外。

4 个答案:

答案 0 :(得分: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,而当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 为NA时返回1。

返回

   self.ref = FIRDatabase.database().reference()
    ref.child("users").child("userID").observeSingleEventOfType(.Value, withBlock: { (snapshot) in

        if snapshot.hasChild("phoneNumber"){

            print("Phone number exist")

        }else{

            print("Phone number doesn't exist")
        }


    })

答案 1 :(得分: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)) 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

Scalar ScalarHSV2BGR(uchar H, uchar S, uchar V) {
    Mat rgb;
    Mat hsv(1,1, CV_8UC3, Scalar(H,S,V));
    cvtColor(hsv, rgb, CV_HSV2BGR);
    return Scalar(rgb.data[0], rgb.data[1], rgb.data[2]);
}

答案 2 :(得分: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)

答案 3 :(得分:0)

我认为解决方法是插入&#34; Type1&#34; df2中的列也会然后按两列合并,如下所示:

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