gpt4 book ai didi

r - 使用 ifelse 改变具有多个条件的新列时如何处理或忽略 NA(已解决)

转载 作者:行者123 更新时间:2023-12-02 09:04:08 25 4
gpt4 key购买 nike

我是 dplyr 的新手,尝试使用 dplyr 和 ifelse 从三个不同的年龄变量创建一个新的复合变量。我做了一个数据框来说明情况如下:

library(dplyr)

z <- data.frame("j6" = c(6, 19, NA, NA, NA, NA, NA, 8, 20, 20, NA),
"j7" = c(27, 20, NA, 7, 19, NA, NA, 20, 30, 9, NA),
"j8" = c(8, 22, NA, 20, NA, 8, 30, NA, NA, NA, 3))

z <- z %>%
mutate(., age_event = NA) %>%
mutate(., age_event = ifelse(j6 < 18 | j7 < 18 | j8 < 18, 1, 0))

我的期望:

  • 三列(j6、j7 和 j8)表示年龄,如果其中至少一列小于 18 岁,则新列(age_event)应为“1”,否则为 0。
  • 如果三列中的两列均为 18 岁或以上,而另一列为 NA,则age_event 变量应为 0。
  • 同样,如果三列中的一列年龄为 18 岁或以上,而其他列均为 NA,则age_event 变量应为 0。
  • 如果三列全部为 NA,则为 NA。

但是结果和问题如下:

> z
j6 j7 j8 age_event
1 6 27 8 1
2 19 20 22 0
3 NA NA NA NA
4 NA 7 20 1
5 NA 19 NA NA <-- should be 0, but NA
6 NA NA 8 1
7 NA NA 30 NA <-- should be 0, but NA
8 8 20 NA 1
9 20 30 NA NA <-- should be 0, but NA
10 20 9 NA 1
11 NA NA 3 1

我想知道是否有办法使用 mutateifelse 将上面的第 5、7、9 个观察结果转为 0。任何建议将不胜感激!


更新(2020年2月27日):我在使用mutateifelse时找到了pmin的解决方案:

z <- z %>% 
mutate(., age_event = ifelse(is.na(j6) & is.na(j7) & is.na(j8), NA,
ifelse(pmin(j6, j7, j8, na.rm = T) < 18, 1, 0)))

> z
j6 j7 j8 age_event
1 6 27 8 1
2 19 20 22 0
3 NA NA NA NA
4 NA 7 20 1
5 NA 19 NA 0
6 NA NA 8 1
7 NA NA 30 0
8 8 20 NA 1
9 20 30 NA 0
10 20 9 NA 1
11 NA NA 3 1

最佳答案

您可以使用 rowMeans() 代替 if_else(),它将处理全部 NA 的情况。

z %>% 
mutate(age_event = +(rowMeans(. < 18, na.rm = TRUE) > 0))

j6 j7 j8 age_event
1 6 27 8 1
2 19 20 22 0
3 NA NA NA NA
4 NA 7 20 1
5 NA 19 NA 0
6 NA NA 8 1
7 NA NA 30 0
8 8 20 NA 1
9 20 30 NA 0
10 20 9 NA 1
11 NA NA 3 1

关于r - 使用 ifelse 改变具有多个条件的新列时如何处理或忽略 NA(已解决),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60407250/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com