【问题标题】:Remove row from complex table based on presense of 1 or 2 values in other table in R根据 R 中其他表中存在 1 或 2 个值从复杂表中删除行
【发布时间】:2020-03-25 14:10:15
【问题描述】:

我想从 'dataframe' 中删除行 'X1' 或 'X2' 列中的名称已经填充在 'comp_list' 列 'gr' 中(即不是使用 'na',而是使用编号)。

下面是一个示例数据集:

dataframe <- data.frame(X1 = c("OP2413iiia","OP2413iiib","OP2413iiic","OP2645ii_a","OP2645ii_b","OP2645ii_c","OP2645ii_d","OP2645ii_e","OP3088i__a","OP5043___a","OP5043___b","OP5044___a","OP5044___b","OP5044___c","OP5046___a","OP5046___b","OP5046___c","OP5046___d","OP5046___e","OP5047___a","OP5047___b","OP5048___b","OP5048___c","OP5048___d","OP5048___e","OP5048___f","OP5048___g","OP5048___h","OP5049___a","OP5049___b","OP5051DNAa","OP5051DNAb","OP5051DNAc","OP5052DNAa","OP5053DNAa"),
                        gr1 = c("3","3","3","3","3","3","3","3","3","4","3","3","3","4","2","3","3","3","4","2","4","3","3","3","4","2","4","2","3","3","3","4","2","4","2"),
                        X2 = c("OP2413iiib","OP2413iiic","OP5046___a","OP2645ii_a","OP2645ii_a","OP2645ii_a","OP2645ii_b","OP2645ii_b","OP5046___a","OP2645ii_b","OP2645ii_c","OP2645ii_c","OP2645ii_c","OP2645ii_c","OP5048___e","OP2645ii_d","OP5046___a","OP2645ii_d","OP2645ii_d","OP2645ii_d","OP2645ii_d","OP2645ii_e","OP5048___e","OP2645ii_e","OP2645ii_e","OP2645ii_e","OP2645ii_e","OP2645ii_e","OP3088i__a","OP3088i__a","OP3088i__a","OP3088i__a","OP3088i__a","OP3088i__a","OP3088i__a"),
                        gr2 = c("3","3","3","4","4","4","2","2","2","2","4","4","4","4","4","2","2","2","2","2","2","4","4","4","4","4","4","4","3","3","3","3","3","3","3"),
                        value = c("1.610613e+00","1.609732e+00","8.829263e-04","1.080257e+01","1.111006e+01","1.110978e+01","4.048302e+00","5.610458e+00","5.609584e+00","9.911490e+00","1.078518e+01","1.133728e+01","1.133686e+01","1.738092e+00","9.247411e+00","5.170646e+00","6.074909e+00","6.074287e+00","6.212711e+00","3.769029e+00","5.793390e+00","1.124045e+01","1.163326e+01","1.163293e+01","7.752766e-01","1.008434e+01","1.222854e+00","6.469443e+00","1.610828e+00","1.784774e+00","1.784235e+00","9.434803e+00","4.512563e+00","9.582847e+00","4.309312e+00"))

comp_list <- data.frame(name = c("OP2413iiia","OP2413iiib","OP2413iiic","OP2645ii_a","OP2645ii_b","OP2645ii_c","OP2645ii_d","OP2645ii_e","OP3088i__a","OP5043___a","OP5043___b","OP5044___a","OP5044___b","OP5044___c","OP5046___a","OP5046___b","OP5046___c","OP5046___d","OP5046___e","OP5047___a","OP5047___b","OP5048___b","OP5048___c","OP5048___d","OP5048___e","OP5048___f","OP5048___g","OP5048___h","OP5049___a","OP5049___b","OP5051DNAa","OP5051DNAb","OP5051DNAc","OP5052DNAa","OP5053DNAa"),
                        gr = c(NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,"4",NA,NA,NA,NA,NA,NA,NA,NA,NA,"5",NA,NA,NA,NA,NA,NA,NA,NA,NA,NA))

对于此示例,我需要一个新的数据框,其中删除了 X1 或 X2 列中具有“OP5046___a”或“OP5048___e”的行。

非常感谢 干杯

【问题讨论】:

    标签: r dataframe filter match


    【解决方案1】:

    我们可以先从comp_list中找到gr中具有非NA值的name,并将它们用于subsetdataframe

    names_to_remove <- comp_list$name[!is.na(comp_list$gr)]
    subset(dataframe, !(X1 %in% names_to_remove | X2 %in% names_to_remove))
    
    #           X1 gr1         X2 gr2        value
    #1  OP2413iiia   3 OP2413iiib   3 1.610613e+00
    #2  OP2413iiib   3 OP2413iiic   3 1.609732e+00
    #4  OP2645ii_a   3 OP2645ii_a   4 1.080257e+01
    #5  OP2645ii_b   3 OP2645ii_a   4 1.111006e+01
    #6  OP2645ii_c   3 OP2645ii_a   4 1.110978e+01
    #7  OP2645ii_d   3 OP2645ii_b   2 4.048302e+00
    #8  OP2645ii_e   3 OP2645ii_b   2 5.610458e+00
    #....
    

    【讨论】:

      猜你喜欢
      • 2023-03-20
      • 1970-01-01
      • 2021-08-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-21
      • 1970-01-01
      相关资源
      最近更新 更多