如果第 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 并且一直在努力解决这个问题。
我试过 if
、mutate_if
、if_else
和 case_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
我有一个 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 并且一直在努力解决这个问题。
我试过 if
、mutate_if
、if_else
和 case_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