如果第 1 列等于零,则将 R 中的 NA 替换为零

Replace NAs in R with zero, if column 1 is equal to zero

我有一个 4 级问卷数据,其中的问题在设计上具有 NA。例如,如果问题 1 的答案是否定的(编码为 0),则其余问题不适用于参与者,将编码为 NA。然而,这些 NA 与那些简单地选择忽略该问题的人不同。因此,仅当 Q1 的答案为 0 时,我才尝试将 NA 替换为 Q2 和 3,否则将 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))
  }

这应该有效:

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, .)))

base R中我们可以为i、select中的列创建一个逻辑索引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)

一个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