【问题标题】:R: Replace column depending on match of two other columnsR:根据其他两列的匹配替换列
【发布时间】:2019-03-16 17:20:07
【问题描述】:

假设有两个巨大的数据框(不同长度)有 2 列,例如:

 df1       df2
A  1      C  X
A  1      D  X
B  4      C  X
A  1      F  X
B  4      A  X
B  4      B  X
C  7      B  X

每次第 1 列有匹配项时,X 应替换为 df1 第 2 列中的数据。如果 df2 的第一列包含元素,但仍然不在 df1 的第一列(F,D),则 X 应替换为 0。

因此有一个巨大的数据框,循环中的循环将没有用。

解决方案应如下所示:

 df1       df2
A  1      C  7
A  1      D  0
B  4      C  7
A  1      F  0
B  4      A  1
B  4      B  4
C  7      B  4

提前谢谢你

【问题讨论】:

    标签: r dataframe dependencies multiple-columns


    【解决方案1】:

    由于'df1'中有重复的行,我们可以得到unique

    df3 <- unique(df1)
    

    然后,使用match 获取idnex

    i1 <- match(df2$Col1, df3$Col1)
    

    并根据索引分配

    df2$Col2 <- df3$Col2[i1]
    

    如果没有匹配,则为NA,可改为0

    df2$Col2[is.na(df2$Col2)] <- 0
    df2
    #  Col1 Col2
    #1    C    7
    #2    D    0
    #3    C    7
    #4    F    0
    #5    A    1
    #6    B    4
    #7    B    4
    

    或者这可以通过join在“Col1”上使用data.table 并使用“df3”中的Col2 分配“Col2”(从第二个数据中删除Col2 之后)来完成

    library(data.table)
    setDT(df2)[, Col2 := NULL][df3, Col2 := Col2, on = .(Col1)]
    

    数据

    df1 <- structure(list(Col1 = c("A", "A", "B", "A", "B", "B", "C"), Col2 = c(1, 
    1, 4, 1, 4, 4, 7)), class = "data.frame", row.names = c(NA, -7L
    ))
    
    df2 <- structure(list(Col1 = c("C", "D", "C", "F", "A", "B", "B"), Col2 = c("X", 
    "X", "X", "X", "X", "X", "X")), class = "data.frame", row.names = c(NA, 
    -7L))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-02-20
      • 2018-04-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多