【问题标题】:R: Filling a matrix with binary values depending on the content of other data framesR:根据其他数据帧的内容用二进制值填充矩阵
【发布时间】:2017-03-21 18:13:54
【问题描述】:

我有两个如下粘贴的数据框:

df1:

v   a
w   b
x   c
y   d
z   e

df2:

v   A
v   C
w   A
x   B
y   C
z   C
z   B

如您所见,v-z 值链接了两个数据框。

我已经像这样设置了第三个数据框:

df3:

    A   B   C
a   NA  NA  NA
b   NA  NA  NA
c   NA  NA  NA
d   NA  NA  NA
e   NA  NA  NA

我想用 0 和 1 填充它,如下所示:

df3:

    A   B   C
a   1   0   1
b   1   0   0
c   0   1   0
d   0   0   1
e   0   1   1

基本上,如果我们以df1的第一行为例,我们可以看到“a”对应于“v”。在df2中,我们可以看到“v”对应“A”和“C”,所以在df3中,“a”行,“A”和“C”列都会有一个“1”。

关于如何解决这个问题的任何想法?

我想过在 df3 上应用一个函数,查找每个元素的行名和列名,看看它们是否在 df1 和 df2 中连接,但我不知道该怎么做。

我希望我解释得足够清楚,如果不清楚,请不要犹豫,告诉我,我会努力改进我的解释。我也为笨拙的标题道歉,我不知道这些操作是如何调用的。

谢谢!

【问题讨论】:

    标签: r


    【解决方案1】:

    这是一种方法:

    library(dplyr)
    full_join(df1, df2, by=c("V1"="V1")) %>% 
      select(V2.x, V2.y) %>%
      table()
    
        V2.y
    V2.x A B C
       a 1 0 1
       b 1 0 0
       c 0 1 0
       d 0 0 1
       e 0 1 1
    

    数据

    df1 <- structure(list(V1 = c("v", "w", "x", "y", "z"), V2 = c("a", "b", 
    "c", "d", "e")), .Names = c("V1", "V2"), class = "data.frame", row.names = c(NA, 
    -5L))
    
    df2 <- structure(list(V1 = c("v", "v", "w", "x", "y", "z", "z"), V2 = c("A", 
    "C", "A", "B", "C", "C", "B")), .Names = c("V1", "V2"), class = "data.frame", row.names = c(NA, 
    -7L))
    

    【讨论】:

    • 相当整洁!谢谢
    • 嗨,我正在尝试对结果表进行进一步的操作,但它的行为不像普通数据框,即使使用 as.data.frame 也是如此。如何将其转换为普通数据框?例如,我正在尝试删除 row.names 并将它们用作第一列,使用 (df3test
    • 使用as.data.frame.matrix
    【解决方案2】:

    一个基本的 R 选项是使用merge。我们通过公共列V1mergedf1df2,然后使用table 查找频率。

    m <- merge(df1, df2, by = "V1", all.x = TRUE)
    table(m$V2.x, m$V2.y)
    
    #   A B C
    # a 1 0 1
    # b 1 0 0
    # c 0 1 0
    # d 0 0 1
    # e 0 1 1
    

    合并后的m在哪里:

      V1 V2.x V2.y
    1  v    a    A
    2  v    a    C
    3  w    b    A
    4  x    c    B
    5  y    d    C
    6  z    e    C
    7  z    e    B
    

    【讨论】:

      【解决方案3】:

      基本上你想要table,这是其他答案已经得出的,但他们建议使用merge(或其“tidyverse”变体full_join)来解决问题。

      但是,更有效的方法是简单地使用matchfactor,然后使用table。以下两项也将为您提供您期望的输出。

      # match -- probably slightly faster than factor
      table(df1$V2[match(df2$V1, df1$V1)], df2$V2)
      
      # factor -- a little bit easier to read
      table(factor(df2$V1, df1$V1, df1$V2), df2$V2) 
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-03-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多