【问题标题】:Comparing elements of data.frames in R比较 R 中 data.frames 的元素
【发布时间】:2015-10-06 15:27:26
【问题描述】:

我有 2 个数据框

> a1
v1  v2  v3
ABCA1   --> GIF
ACTA1   --| CSNK2A1
ACTN4   --| HDAC7
ACTN4   --> RARA

> a2
v1  v2  v3
ACTA1   --| CSNK2A1
ABCD2   --| HDAC7
ABCA1   --| GIF
ACTN4   --> XYZ1      

我想输出a1$element1 == a2$element1 & a1$element3 == a2$element3 & a1$element2 != a2$element2。所以,结果将是:

> a3
ABCA1   --> GIF

因为这一行中的所有元素都满足我们的所有 3 个条件。它是a1 中的第 1 行和a2 中的第 3 行。如您所见(a1 的第 1 行和a2 的第 3 行)ABCA1 == ABCA1 & --> != --| & GIF == GIF

【问题讨论】:

    标签: r dataframe


    【解决方案1】:

    你可以试试merge:

    m2 <- merge(a1, a2, by=c("v1", "v3"))
    m2[m2[,3] != m2[,4],][c(1,3,2)]
    #     v1 v2.x  v3
    #1 ABCA1  --> GIF
    

    我们首先合并第 1 列和第 3 列。这将连接前两个条件的情况。对于最后一个条件,测试列符号不同的情况。

    在创建数据框时,stringsAsFactors 也应设置为 FALSE。


    使用data.table,您可以利用其浅拷贝效率进行合并。

    setDT(a1)[a2, on = c("v1", "v3")][v2 != i.v2]
          v1  v2  v3 i.v2
    1: ABCA1 --> GIF  --|
    

    【讨论】:

    • 谢谢.. 它完成了这项工作。
    • 也许library(data.table) ; setDT(a1)[a2, on = c("v1", "v3"), nomatch = 0L][v2 != i.v2]只是为了好玩
    • @DavidArenburg 你能帮我解决这个问题吗:[stackoverflow.com/questions/35484595/…
    【解决方案2】:

    这似乎对我有用:

    a1[ intersect(which((paste0(a1$v1, a1$v3) %in% paste0(a2$v1, a2$v3))),
                  which(a1$v2 != a2$v2)) ,]
    
    #     v1  v2  v3
    #1 ABCA1 --> GIF
    

    首先,找出 a1 和 a2 中的哪些行有共同的第 1 列和第 3 列。然后找出哪些行没有共同的第二列。然后得到两者的交集并将其用于子集a1

    数据:

    a1 <- read.table(header=T,text='v1  v2  v3
    ABCA1   --> GIF
    ACTA1   --| CSNK2A1
    ACTN4   --| HDAC7
    ACTN4   --> RARA', stringsAsFactors=F)
    
    a2 <- read.table(header=T,text='v1  v2  v3
    ACTA1   --| CSNK2A1
    ABCD2   --| HDAC7
    ABCA1   --| GIF
    ACTN4   --> XYZ1', stringsAsFactors=F)
    

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-12-18
    • 2021-03-21
    • 1970-01-01
    • 1970-01-01
    • 2023-03-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多