【发布时间】:2021-11-24 09:17:00
【问题描述】:
我正在使用一个面板数据集,因此在几年的时间里,同一个问题被问了好几次。我想用最旧的波的值创建一个新变量。如果在这个最旧的波中有 NA,我只想用第二波的“更新”值覆盖这些值。如果第一波和第二波中有缺失值,我只想用第三波的值覆盖那些值。因此,我正在使用 mutate 和 case_when 并在 case_when 中组合条件。但是,要么我不能用较新的值覆盖旧值,要么我几乎只产生缺失值,因为条件几乎从不成立。在第二种情况下,我想知道如何首先从第一波中获取值,并且只在 NA 的情况下替换它们。我尝试了以下变体:
1.
gles_panel2 <- gles_panel2 %>%
mutate(test3 = case_when(kp7_180 %in% c(2) ~ "1",
kp7_180 %in% c(1, 6) ~ "0",
kp7_180 < 1 ~ "NA",
kp7_180 %in% NA & kp10_2780 == 2 ~ "1",
kp7_180 %in% NA & kp10_2780 == 1 ~ "0",
kp7_180 %in% NA & kp10_2780 < 1 ~ "NA"))
2.
gles_panel2 <- gles_panel2 %>%
mutate(test3 = case_when(kp7_180 %in% c(2) ~ "1",
kp7_180 %in% c(1, 6) ~ "0",
kp7_180 < 1 ~ "NA"))
gles_panel2 <- gles_panel2 %>%
mutate(test3 = case_when(test3 %in% NA & kp10_2780 == 2 ~ "1",
test3 %in% NA & kp10_2780 == 1 ~ "0",
test3 %in% NA & kp10_2780 < 1 ~ "NA"))
我使用嵌套的 ifelse 函数(见下文)实现了它,但我想使用 case_when 获得相同的结果。
gles_panel2 <- gles_panel2 %>%
mutate(nwahl2013_test = ifelse(kp7_180==2,1,ifelse(kp7_180 %in% c(1,6),0, NA)))
gles_panel2 <- gles_panel2 %>%
mutate(nwahl2013_test = ifelse(is.na(nwahl2013_test) & kp10_2780==2,1,ifelse(is.na(nwahl2013_test) & kp10_2780==1,0, nwahl2013_test)))
【问题讨论】:
-
欢迎来到 SO!为了帮助我们提供帮助,您是否介意通过共享您的数据的 sn-p 来重现您的问题?见how to make a minimal reproducible example。要共享您的数据,您可以在控制台中输入
dput(NAME_OF_DATASET),然后将以structure(....开头的输出复制并粘贴到您的帖子中。如果您的数据集有很多观察结果,您可以这样做,例如dput(head(NAME_OF_DATASET, 20))用于前二十行数据。
标签: r if-statement case