gpt4 book ai didi

r - 在 mutate 中使用 ifelse 并处理 NA

转载 作者:行者123 更新时间:2023-12-02 21:14:15 26 4
gpt4 key购买 nike

感谢您的宝贵时间。

我对使用ifelse有疑问mutate内功能。 ifelse来自 base R,同时mutate来自dplyr包。

我的问题是如何 ifelse handle NA值(value)观。

我有两个字符向量: example_character_vector包含一些单词和偶尔的NA值,而另一个向量 color_indicator ,仅包含单词 Green、Yellow 和 Red。

我想改变我的数据框 example_data_frame创建一个新的override_color_indicator根据 example_character_vector 中的条件将一些黄色转换为绿色的变量.

示例数据:

example_character_vector <- c("Basic", NA, "Full", "None", NA, "None", 
NA)
color_indicator <- c("Green", "Green", "Yellow", "Yellow", "Yellow",
"Red", "Red")

example_data_frame <- data.frame(example_character_vector,
color_indicator)

这个 example_data_frame 看起来像这样:

  example_character_vector color_indicator
1 Basic Green
2 <NA> Green
3 Full Yellow
4 None Yellow
5 <NA> Yellow
6 None Red
7 <NA> Red

我正在使用嵌套ifelse mutate 内的语句创建一个名为 override_color_indicator 的新列.

如果color_indicator是黄色的,example_character_vector包含“Full”一词,我想要override_color_indicator成为绿色(这是我的数据中的一个特例)。否则,我想要override_color_indicatorcolor_indicator 完全相同.

这是我的变异:

example_data_frame <- example_data_frame %>% 
mutate(override_color_indicator =
ifelse(color_indicator == "Green",
"Green",
ifelse(color_indicator == "Yellow" &
str_detect(example_character_vector, "Full"),
"Green",
ifelse(color_indicator == "Yellow" &
!str_detect(example_character_vector, "Full") |
color_indicator == "Yellow" &
is.na(character_vector),
"Yellow",
"Red"))))

(对格式表示歉意 - 我尝试为 Stack Overflow 尽力对其进行格式化。)

上面的代码生成这个数据框:

  example_character_vector color_indicator override_color_indicator
1 Basic Green Green
2 <NA> Green Green
3 Full Yellow Green
4 None Yellow Yellow
5 <NA> Yellow <NA>
6 None Red Red
7 <NA> Red Red

我的问题是,在第 5 行中,override_color_indicator 中引入了 NA。颜色。我希望它不是 NA,而是“黄色”。

为了清楚起见,这是我想要的数据框:

  example_character_vector color_indicator override_color_indicator
1 Basic Green Green
2 <NA> Green Green
3 Full Yellow Green
4 None Yellow Yellow
5 <NA> Yellow Yellow
6 None Red Red
7 <NA> Red Red

我已经寻找了很多答案,但在任何地方都找不到。我可以创建一个解决方法,然后返回并手动将条目分配给黄色,但从编程的角度来看,我不喜欢这个选项。

此外,我只是有点好奇为什么会发生这种行为。我已经遇到过这个问题好几次了。

<小时/>

感谢您的宝贵时间!

最佳答案

您应该在此处使用 case_when,但您得到 NA 的原因是因为第二个 ifelse。关于 NA 在 R 中如何传播的一件有趣的事情是(根据文档)“如果结果不明确,结果将是 NA”。因此,因为我们知道无论 NA 为何,这都将是 FALSE,所以我们有

NA & FALSE
#> [1] FALSE

但由于这是不明确的,NA 在这里传播。

NA & TRUE
#> [1] NA

第 5 行的 TRUE 表示 Yellow,但 str_detect 将返回 NA,因此 ifelse code> 返回 NA。您可以通过在该行中添加 & !is.na(example_character_vector) 来解决此问题:

library(tidyverse)
example_data_frame <- structure(list(example_character_vector = c("Basic", NA, "Full", "None", NA, "None", NA), color_indicator = c("Green", "Green", "Yellow", "Yellow", "Yellow", "Red", "Red")), class = "data.frame", row.names = c(NA, -7L))
example_data_frame %>%
mutate(
override_color_indicator =
ifelse(
color_indicator == "Green",
"Green",
ifelse(
color_indicator == "Yellow" &
str_detect(example_character_vector, "Full") & !is.na(example_character_vector),
"Green",
ifelse(
color_indicator == "Yellow" &
(!str_detect(example_character_vector, "Full") | is.na(example_character_vector)),
"Yellow",
"Red"
)
)
)
)
#> example_character_vector color_indicator override_color_indicator
#> 1 Basic Green Green
#> 2 <NA> Green Green
#> 3 Full Yellow Green
#> 4 None Yellow Yellow
#> 5 <NA> Yellow Yellow
#> 6 None Red Red
#> 7 <NA> Red Red

但一定要使用case_when!

关于r - 在 mutate 中使用 ifelse 并处理 NA,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52545756/

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