【问题标题】:Convert values in one dataframe to NA based on NA's in a second dataframe根据第二个数据帧中的 NA 将一个数据帧中的值转换为 NA
【发布时间】:2017-12-11 17:19:21
【问题描述】:

我确信有一种非常简单的方法可以完成这项任务,但我似乎无法弄清楚。我有两个数据框,它们具有完全相同的数据,但来自两个不同的位置。

df1 <- data.frame(a=c(1,2,3,NA),b=c(1,5,4,6))
df2 <- data.frame(a=c(3,4,5,6),b=c(7,8,9,NA))

我想要的输出是两个具有新版本的 df1 和 df2,它们完全相同,但底行仅包含 NA 值。 IE。如果一个数据帧中有一个 NA 值,我需要在另一个数据帧的相应单元格上复制它...

df1[4,2] <- NA
df2[4,1] <- NA

我从相反的角度(例如Filling missing values in a data.frame from another data.frame)看到了非常相似的问题,但我不知道如何将其应用于我自己的数据。先感谢您。

【问题讨论】:

    标签: r dataframe


    【解决方案1】:

    我们可以根据NA在两个数据集中的任何一个中的出现创建一个索引并相乘

    i1 <- NA^(is.na(df1)| is.na(df2))
    df1 <- df1 * i1
    df2 <- df2 * i1
    

    【讨论】:

    • 非常感谢您。我会尽快打勾。
    • 有趣。所以NA^FALSE == 1 和NA^TRUE == NA。你知道为什么会这样吗?
    • @EricWatt 二进制表示,即NA^1 是 NA 而NA^0 是 1
    • 将其视为 ^1^0 是有道理的,我被 TRUE 和 FALSE 分散了注意力。感谢您的澄清。
    【解决方案2】:

    这里有一些可能性。 (1) 似乎是最干净、最清晰的意图。 (3) 有效,但在排除副作用方面似乎过于复杂。

    1) 替换试试replace

    df1new <- replace(df1, is.na(df2), NA)
    df2new <- replace(df2, is.na(df1), NA)
    

    如果将df1newdf2new 替换为df1df2,这将继续有效,尽管它会增加复杂性。在这种情况下,最好在之后分配df1df2(即df1 &lt;- df1new; df2 &lt;-df2new)以避免复杂性。

    2) 索引 也可以这样写:

    df1new <- df1
    df1new[is.na(df2)] <- NA
    
    df2new <- df2
    df2new[is.na(df1)] <- NA
    

    3) 破坏性索引 不确定这是一个好主意,但它可以在这里工作:

    df1[is.na(df2)] <- df2[is.na(df1)] <- NA
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-21
      • 2021-01-07
      • 2014-03-22
      • 2021-10-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多