【问题标题】:Conditionally replace values of one variable with values of another variable有条件地将一个变量的值替换为另一个变量的值
【发布时间】:2021-02-22 17:53:23
【问题描述】:

我确信这个问题已经被问了很多时间,但我找不到解决方案。

我正在尝试根据一个条件将多个变量的值替换为其他变量中存在的值。我的数据框看起来像这样:

z <- data.frame (ID = c(23,24,25,26,27),
              Q1.1 = c("Yes","No","No","No","Yes"),
              Q1.2 = c("No","Yes","Yes","No","No"),
              Q1.3 = c("No","No","No","Yes","No"),
              Q2.1 = c("7",NA,NA,NA,"4"),
              Q2.2 = c(NA,"6","9",NA,NA),
              Q2.3 = c(NA,NA,NA,"8",NA))

我要做的是将变量 Q1.1、Q1.2 和 Q1.3 的值分别替换为变量 Q2.1、Q2.2 和 Q2.3 的值,前提是值等于是。理想的输出应该是这样的:

z <- data.frame (ID = c(23,24,25,26,27),
              Q1.1 = c("7","No","No","No","4"),
              Q1.2 = c("No","6","9","No","No"),
              Q1.3 = c("No","No","No","8","No"))

我已经尝试了几件事,但到目前为止都没有奏效。你知道如何进行吗?

【问题讨论】:

    标签: r replace conditional-statements


    【解决方案1】:

    我们可以使用coalesce

    library(dplyr)
    library(purrr)
    cbind(z['ID'], map2_dfc(z[5:7], z[2:4], coalesce))
    

    -输出

    #  ID Q2.1 Q2.2 Q2.3
    #1 23    7   No   No
    #2 24   No    6   No
    #3 25   No    9   No
    #4 26   No   No    8
    #5 27    4   No   No
    

    【讨论】:

      【解决方案2】:

      欢迎来到 SO!
      另一个基本的 R 解决方案可能是这样的:

      # split into two matrix the columns
      z1 <- as.matrix(z[,2:4])
      z2 <- as.matrix(z[,5:7])
      
      # create a data.frame with
      data.frame(ID = z$ID,                 # the id
                 ifelse(z1 == 'Yes',z2,z1)) # the matching criteria matrix
        ID Q1.1 Q1.2 Q1.3
      1 23    7   No   No
      2 24   No    6   No
      3 25   No    9   No
      4 26   No   No    8
      5 27    4   No   No
      

      【讨论】:

      • 非常感谢!正是我想要的!
      【解决方案3】:

      在基础 R 中你会发现:

      reshape(transform(reshape(z, 2:ncol(z), dir="long", idvar = "ID"), 
               Q1 = ifelse(Q1=='Yes', Q2, Q1), Q2=NULL), dir="wide", idvar = 'ID')
      
           ID Q1.1 Q1.2 Q1.3
      23.1 23    7   No   No
      24.1 24   No    6   No
      25.1 25   No    9   No
      26.1 26   No   No    8
      27.1 27    4   No   No
      

      【讨论】:

        猜你喜欢
        • 2013-08-06
        • 2014-10-06
        • 2019-09-01
        • 2022-07-21
        • 2023-01-26
        • 2020-02-18
        • 2016-10-21
        • 2022-11-30
        • 1970-01-01
        相关资源
        最近更新 更多