r-在case _when中覆盖列并组合复杂条件



我正在处理一个面板数据集,所以在几年的时间里,同样的问题已经被问了好几次了。我想用最古老的波浪的值创建一个新的变量。如果在这个最古老的波中有NA,我只想用";更新的";第二波的值。如果第一波和第二波中有缺失的值,我只想用第三波的值覆盖这些值。因此,我正在处理mutate和case_hen,并在case_hen中组合条件。然而,要么我不能用新的值覆盖旧的值,要么我几乎只生成缺失的值,因为这种情况几乎永远不会成立。在第二种情况下,我想知道如何首先从第一波中获取值,并仅在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)))

我通过以下方式解决了问题:

gles_panel2 <- gles_panel %>%
mutate(nwahl2013 = case_when(kp7_180 %in% c(2) ~ 1,
kp7_180 %in% c(1, 6) ~ 0,
))
gles_panel2 <- gles_panel2 %>%
mutate(nwahl2013 = case_when(is.na(nwahl2013) & kp10_2780 %in% c(2) ~ 1,
is.na(nwahl2013) & kp10_2780 %in% c(1, 6) ~ 0,
!is.na(nwahl2013) ~ nwahl2013))
gles_panel2 <- gles_panel2 %>%
mutate(nwahl2013 = case_when(is.na(nwahl2013) & kp17_2780 %in% c(2) ~ 1,
is.na(nwahl2013) & kp17_2780 %in% c(1, 6) ~ 0,
!is.na(nwahl2013) ~ nwahl2013))

我知道主要的问题是告诉R,不满足左手边"0"的前两行中的条件的值;case _ when";应取自";nwahl2013";变量如果其他人也面临同样的问题,这是一个(一种可能的(解决方案:-(

最新更新