【问题标题】:Replace NAs in R with zero, if column 1 is equal to zero如果第 1 列等于零,则将 R 中的 NA 替换为零
【发布时间】:2021-01-04 18:42:56
【问题描述】:

我有一个 4 级问卷数据,其中包含设计为 NA 的问题。例如,如果问题 1 的答案是否定的(编码为 0),则其余问题不适用于参与者,将编码为 NA。然而,这些 NA 不同于那些简单地选择忽略这个问题的人。因此,仅当 Q1 的答案为 0 时,我才尝试将 Q2 和 3 的 NA 替换为 0,否则保留 NA。 我做了一个数据框来进一步说明我的情况:

Q1 <- c(0,0,1,2,0,4)
Q2 <- c(NA,NA,2,1,NA,NA)
Q3 <- c(NA,NA,2,1,NA,4)

data <- cbind(Q1,Q2,Q3)

  Q1 Q2 Q3 
1  0  NA NA  
2  0  NA NA 
3  1  2  2  
4  2  1  1  
5  0  NA NA  
6  4  NA  4

预期输出:

 Q1   Q2 Q3 
1  0  0   0  
2  0  0   0 
3  1  2   2  
4  2  1   1  
5  0  0   0  
6  4  NA  4

在预期的输出中,如果 Q1 为 0,则 Q2 和 3 中的 NA 更改为 0。对于参与者 6,NA 保持原样。

我正在自学 R,并且一直在为此苦苦挣扎。 我尝试了ifmutate_ifif_elsecase_when 功能都无济于事。有人帮帮我。

这是我尝试过的代码之一的示例,它给了我一个错误。

data %>% 
ifelse (Q1 == 0) {
  mutate(Q2 = coalesce(Q2,0))
  }

【问题讨论】:

    标签: r dplyr survey


    【解决方案1】:

    这应该可行:

    library(dplyr)
    data %>% 
        as.data.frame() %>% 
        mutate(across(c(Q2,Q3), ~case_when(Q1 == 0 ~ 0, TRUE ~ .)))
    #   Q1 Q2 Q3
    # 1  0  0  0
    # 2  0  0  0
    # 3  1  2  2
    # 4  2  1  1
    # 5  0  0  0
    # 6  4 NA  4
    

    您的代码失败了,因为ifelse() 想要一个向量作为输入并提供一个向量作为输出。如果需要,您也可以使用 ifelse() 代替 case_when()

    library(dplyr)
    data %>% 
        as.data.frame() %>% 
        mutate(across(c(Q2,Q3), ~ifelse(Q1 == 0, 0, .)))
    

    【讨论】:

      【解决方案2】:

      base R 中我们可以为i 创建一个逻辑索引,选择j 中的列并进行赋值

      data[!data$Q1, -1] <- 0
      data
      #  Q1 Q2 Q3
      #1  0  0  0
      #2  0  0  0
      #3  1  2  2
      #4  2  1  1
      #5  0  0  0
      #6  4 NA  4
      

      数据

      data <- data.frame(Q1,Q2,Q3)
      

      【讨论】:

        【解决方案3】:

        data.table 选项

        > setDT(data)[Q1 == 0, `:=`(Q2 = 0, Q3 = 0)][]
           Q1 Q2 Q3
        1:  0  0  0
        2:  0  0  0
        3:  1  2  2
        4:  2  1  1
        5:  0  0  0
        6:  4 NA  4
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2015-08-08
          • 2019-07-04
          • 1970-01-01
          • 1970-01-01
          • 2022-01-24
          • 1970-01-01
          • 2019-06-11
          • 2019-11-05
          相关资源
          最近更新 更多