r语言 - 如何使ifelse语句忽略NAs?



你好,我有这个代码

df <- df %>%
mutate(prev_PC = ifelse(changed_PC  == "No" & (is.na(prev_PC) | prev_PC == ""), new_PC, prev_PC))

我正在尝试更改以前的邮政编码。假设我们有旧的邮政编码,我们有新的邮政编码。

旧的邮政编码来自一个较小的数据集,该数据集与一个具有新邮政编码的较大数据集重叠。在与旧的数据集相同的数据集中,我们有一个变量,如果人们改变了他们的邮政编码,则表示否或是(关于旧邮政编码的问卷在新邮政编码的问卷之后进行)。

我想使用这个变量来填充旧的邮政编码,如果他们没有改变他们的邮政编码。但是,由于changed_PC变量中大约有1000个NA值,因此在这些情况下,它将用NAs填充prev_PC,并且在prev_PC中留下比以前更多的NAs。我怎样才能改变这一点?

TL;DR:我想要改变的pc == "No"if语句忽略NAs。所以如果changed_PC == NA,我只想让它保持prev_PC的值就好像它说的是"Yes"而不是将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

(见前后)

最新更新