【问题标题】:How do I replace values across multiple columns in a data-frame with values from a second column, based on a match with a third column using R?如何根据使用 R 与第三列的匹配,将数据框中多列的值替换为第二列中的值?
【发布时间】:2021-02-21 20:19:17
【问题描述】:

我正在使用 R 中包含以下字符列和值的单个数据框。

C1<-c("1","2","3","4","5")
C2<-c("x", "t", "u", "r", "j")
C3<-c("2","5","3","1","4")
C4<-c("3","1","NA", "2","5")
df<-data.frame(C1,C2,C3,C4)

我正在尝试编写将替换 C3 和 C4 中的值的代码,如下所示:

  1. 对于 C3 中的每个值,在 C1 中找到相同的值。
  2. 将 C3 中的值替换为 C2 中与 C3/C1 匹配的行中出现的值。在 C3 中,对于 例如,“2”(第一个值)将替换为“t”,“5”将替换为“j”,“3”将 替换为“3”等等。
  3. 对 C4 中的值重复相同的过程。
  4. 跳过任何在 C3 或 C4 中具有 NA 的单元格。

初始数据框如下所示:

最终的数据框应如下所示:

我还没有想出可以完成这项任务的代码(基础 R 或 Dplyr)。如果有人可以提供帮助,我将不胜感激。

谢谢!

这是一个新的 df,我尝试使用受访者提供的代码(例如 df[c("C3", "C4")]

我要退回 C3 C4 的所有 NA,但不明白为什么。 C3 和 C1 之间存在匹配项。

【问题讨论】:

    标签: r


    【解决方案1】:

    我们可以使用match

    df[c("C3", "C4")] <- lapply(df[c("C3", "C4")], function(x) df$C2[match(x, df$C1)])
    

    【讨论】:

    • 非常感谢您的回复!我以前没有使用过 match() 。也就是说,我无法根据我的数据集调整代码建议。我不断获得应该匹配的 NA 列(请参阅我的请求中更新的示例 df)。谁能帮助我了解我的比赛失败的原因或如何解决问题?
    【解决方案2】:

    我也使用了match,但将其拆分为两个不同的语句以更清楚地说明发生了什么:

    # Create sample data
    C1<-c("1","2","3","4","5")
    C2<-c("x", "t", "u", "r", "j")
    C3<-c("2","5","3","1","4")
    C4<-c("3","1","NA", "2","5")
    df<-data.frame(C1,C2,C3,C4)
    
    # Make replacements
    df$C3_mod <- ifelse(is.na(df$C3), df$C3, df$C2[match(df$C3, df$C1)])
    df$C4_mod <- ifelse(is.na(df$C4), df$C4, df$C2[match(df$C4, df$C1)])
    
    # View results
    df
    #   C1 C2 C3 C4 C3_mod C4_mod
    # 1  1  x  2  3      t      u
    # 2  2  t  5  1      j      x
    # 3  3  u  3 NA      u   <NA>
    # 4  4  r  1  2      x      t
    # 5  5  j  4  5      r      j
    

    【讨论】:

      【解决方案3】:

      match 与矩阵一起使用。

      cols <- c('C3', 'C4')
      df[cols] <- df$C2[match(as.matrix(df[cols]), df$C1)]
      df
      
      #  C1 C2 C3   C4
      #1  1  x  t    u
      #2  2  t  j    x
      #3  3  u  u <NA>
      #4  4  r  x    t
      #5  5  j  r    j
      

      【讨论】:

        【解决方案4】:

        我解决了我的 NA 值问题。事实证明,我没有考虑到列值中有空格。再次感谢大家的回复。在这个过程中我学到了很多东西。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2023-01-26
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-09-08
          • 2020-01-12
          • 2013-11-26
          相关资源
          最近更新 更多