【问题标题】:Overwriting columns and combining complex conditions in case_when在 case_when 中覆盖列并组合复杂条件
【发布时间】: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


【解决方案1】:

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

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 不满足“case_when”前两行左侧条件的值应该取自“nwahl2013”​​变量。如果其他人应该面临同样的问题,这是一个(一个可能的)解决方案:-)

【讨论】:

    猜你喜欢
    • 2016-09-04
    • 2020-12-20
    • 1970-01-01
    • 1970-01-01
    • 2021-07-01
    • 2013-04-06
    • 1970-01-01
    • 1970-01-01
    • 2018-11-29
    相关资源
    最近更新 更多