如何使 ifelse 语句忽略 NA?
How to make an ifelse statement ignore NAs?
你好,我有这个代码
df <- df %>%
mutate(prev_PC = ifelse(changed_PC == "No" & (is.na(prev_PC) | prev_PC == ""), new_PC, prev_PC))
我正在尝试更改以前的邮政编码。假设我们有旧邮政编码和新邮政编码。
旧邮政编码来自较小的数据集,该数据集与具有新邮政编码的较大数据集重叠。在与旧的相同的数据集中,我们有一个变量,如果人们更改了他们的邮政编码,则表示否或是(关于旧邮政编码的问卷是在新的问卷之后询问的)。
如果他们没有更改邮政编码,我想使用此变量将旧邮政编码填充为新邮政编码。但是,由于 changed_PC 变量中有大约 1000 个 NA 值,因此在这些情况下它会用 NA 填充 prev_PC,而我在 prev_PC 中留下的 NA 比以前更多。我该如何更改?
TL;DR:我希望 changed_PC == "No" if 语句忽略 NA。因此,如果 changed_PC == NA,我只希望它保留 prev_PC 中的值,就好像它说“是”而不是将 prev_PC 变成 NA。
这是一个例子:
prev_PC <- c(5039, 1402, 3050, NA, NA, NA, NA, NA)
new_PC <- c(5039, 1402, 3050, 3021, 2154, 4853, 1252, 2954)
changed_PC <- c("No", NA, "No", "Yes", NA, NA, "No", "No")
df <- data.frame(prev_PC , new_PC, changed_PC )
我想要的:
prev_PC
5039, 1402, 3050, NA, NA, NA, 1252, 2954
我得到的:
prev_PC
5039, NA, 3050, NA, NA, NA, 1252, 2954
第一个解决方案如下:
df %>%
mutate(prev_PC = case_when(changed_PC == "No" &
is.na(prev_PC) ~ new_PC,
TRUE ~ prev_PC))
但这可能更好:
df %>%
mutate(prev_PC = if_else(is.na(prev_PC) &
changed_PC == "No", new_PC, prev_PC))
导致:
> df %>%
+ print() %>%
+ mutate(prev_PC = if_else(is.na(prev_PC) &
+ changed_PC == "No", new_PC, prev_PC))
prev_PC new_PC changed_PC
1 5039 5039 No
2 1402 1402 <NA>
3 3050 3050 No
4 NA 3021 Yes
5 NA 2154 <NA>
6 NA 4853 <NA>
7 NA 1252 No
8 NA 2954 No
prev_PC new_PC changed_PC
1 5039 5039 No
2 1402 1402 <NA>
3 3050 3050 No
4 NA 3021 Yes
5 NA 2154 <NA>
6 NA 4853 <NA>
7 1252 1252 No
8 2954 2954 No
(见前后)
你好,我有这个代码
df <- df %>%
mutate(prev_PC = ifelse(changed_PC == "No" & (is.na(prev_PC) | prev_PC == ""), new_PC, prev_PC))
我正在尝试更改以前的邮政编码。假设我们有旧邮政编码和新邮政编码。
旧邮政编码来自较小的数据集,该数据集与具有新邮政编码的较大数据集重叠。在与旧的相同的数据集中,我们有一个变量,如果人们更改了他们的邮政编码,则表示否或是(关于旧邮政编码的问卷是在新的问卷之后询问的)。
如果他们没有更改邮政编码,我想使用此变量将旧邮政编码填充为新邮政编码。但是,由于 changed_PC 变量中有大约 1000 个 NA 值,因此在这些情况下它会用 NA 填充 prev_PC,而我在 prev_PC 中留下的 NA 比以前更多。我该如何更改?
TL;DR:我希望 changed_PC == "No" if 语句忽略 NA。因此,如果 changed_PC == NA,我只希望它保留 prev_PC 中的值,就好像它说“是”而不是将 prev_PC 变成 NA。
这是一个例子:
prev_PC <- c(5039, 1402, 3050, NA, NA, NA, NA, NA)
new_PC <- c(5039, 1402, 3050, 3021, 2154, 4853, 1252, 2954)
changed_PC <- c("No", NA, "No", "Yes", NA, NA, "No", "No")
df <- data.frame(prev_PC , new_PC, changed_PC )
我想要的:
prev_PC
5039, 1402, 3050, NA, NA, NA, 1252, 2954
我得到的:
prev_PC
5039, NA, 3050, NA, NA, NA, 1252, 2954
第一个解决方案如下:
df %>%
mutate(prev_PC = case_when(changed_PC == "No" &
is.na(prev_PC) ~ new_PC,
TRUE ~ prev_PC))
但这可能更好:
df %>%
mutate(prev_PC = if_else(is.na(prev_PC) &
changed_PC == "No", new_PC, prev_PC))
导致:
> df %>%
+ print() %>%
+ mutate(prev_PC = if_else(is.na(prev_PC) &
+ changed_PC == "No", new_PC, prev_PC))
prev_PC new_PC changed_PC
1 5039 5039 No
2 1402 1402 <NA>
3 3050 3050 No
4 NA 3021 Yes
5 NA 2154 <NA>
6 NA 4853 <NA>
7 NA 1252 No
8 NA 2954 No
prev_PC new_PC changed_PC
1 5039 5039 No
2 1402 1402 <NA>
3 3050 3050 No
4 NA 3021 Yes
5 NA 2154 <NA>
6 NA 4853 <NA>
7 1252 1252 No
8 2954 2954 No
(见前后)