【问题标题】:output row names containing NA in atleast one data.frame在至少一个 data.frame 中输出包含 NA 的行名
【发布时间】:2021-12-11 21:04:30
【问题描述】:

我有两个数据框:

df1:

        c1-1       c2-45      c3-65      c4-88         c5-97
r1        NA    0.598817857 0.053798422 0.776829475      NA
r2  0.481191121 0.67205121  0.50231424  0.933501988 0.169838618
r3  0.127680486       NA    0.188186772       NA    0.410198769
r4  0.448870194 0.372560979 0.627946034 0.277422856 0.540501786
r5  0.828152448 0.962372344 0.72686092  0.881644452 0.822969723

df2:

          c1-24     c2-98     c3-77        c4-82       c5-9
r1  0.528260595 0.602697657 0.15193253  0.458712206 0.785602995
r2  0.250479754 0.999715659 0.575051699     NA      0.830962509
r3     NA           NA      0.733031402 0.189934875 0.554902551
r4  0.160801532 0.611729999 0.665725625 0.966146299 0.005503371
r5  0.483603251 0.306977032 0.377184726 0.109827232 0.63159439

它们都包含相同的行名,但包含不同的列名('-' 符号之前的字符串对于两个数据帧是相同的,但之后的字符串是不同的)。

我想比较两个数据帧和至少其中一个包含 NA 的输出行。例如:上例中的输出将是:

r1,r2,r3

【问题讨论】:

    标签: r subset


    【解决方案1】:
    • is.na 检查 NA
    • 如果df1df2 具有NA,则使用| 获取TRUE
    • rowSums 计算行中的 NA
    • 仅返回具有超过 0 个NA 值的行的行名。
    rownames(df1)[rowSums(is.na(df1) | is.na(df2)) > 0]
    #[1] "r1" "r2" "r3"
    

    【讨论】:

    • 完美。也谢谢你的解释!
    【解决方案2】:

    我们可以使用

    row.names(df1)[Reduce(`|`, lapply(df1 * df2, is.na))]
    

    -输出

    [1] "r1" "r2" "r3"
    

    【讨论】:

      猜你喜欢
      • 2021-03-06
      • 2020-09-22
      • 2021-05-02
      • 2022-06-22
      • 2021-08-24
      • 2022-01-13
      • 1970-01-01
      • 1970-01-01
      • 2020-05-04
      相关资源
      最近更新 更多