R 在mutate中使用ifelse并处理NA';s

R 在mutate中使用ifelse并处理NA';s,r,if-statement,dplyr,R,If Statement,Dplyr,谢谢你抽出时间 关于在mutate函数中使用ifelse,我有一个问题ifelse来自baseR,而mutate来自dplyr包 我的问题是关于ifelse如何处理NA值 我有两个字符向量: example\u character\u vector包含一些单词和偶尔出现的NA值,而另一个向量color\u indicator仅包含单词绿色、黄色和红色 我想改变我的数据帧example\u data\u frame以创建一个新的override\u color\u指示器变量,该变量根据exampl

谢谢你抽出时间

关于在
mutate
函数中使用
ifelse
,我有一个问题
ifelse
来自
base
R,而
mutate
来自
dplyr

我的问题是关于
ifelse
如何处理
NA

我有两个字符向量:
example\u character\u vector
包含一些单词和偶尔出现的
NA
值,而另一个向量
color\u indicator
仅包含单词绿色、黄色和红色

我想改变我的数据帧
example\u data\u frame
以创建一个新的
override\u color\u指示器
变量,该变量根据
example\u character\u 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_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
  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
我找了很多答案,但到处都找不到。我可以创建一个变通方法,然后返回并手动将条目分配给Yellow,但从编程的角度来看,我不喜欢这个选项

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



谢谢你的时间

试试这个
case\u when
是一种更灵活的向量化
if
,允许您使用
TRUE
来表示“否则,请使用
color\u指示器中的值”

示例数据帧%
变异(x=案例(颜色=黄色)&
示例\u字符\u向量==“完整”~“绿色”,
真彩色(U指示器)
#>示例字符向量颜色指示器x
#>1基本绿色
#>2绿色
#>3全黄绿色
#>4无黄色
#>5黄-黄
#>6无红色
#>7红色

你应该在这里使用
case\u,但是你得到
NA
的原因是因为第二个
ifelse
。关于
NA
如何在R中传播的一个有趣的事情是,(从文档中)“如果结果不明确,结果将是NA“。因此,因为我们知道这将是
FALSE
,而不管
NA
,所以我们

NA&FALSE
#>[1]错误
但是由于这是不明确的,
NA
在这里传播

NA&TRUE
#>[1]NA
第5行的
TRUE
表示
黄色
,但
stru-detect
将返回
NA
,因此
ifelse
返回
NA
。您可以通过添加
&来解决此问题!在该行中是.na(例如字符向量)

库(tidyverse)
示例\u数据\u帧%
变异(
覆盖颜色指示器=
如果有(
颜色指示灯==“绿色”,
“绿色”,
如果有(
颜色指示器==“黄色”&
str_detect(示例_character_vector,“Full”)&!is.na(示例_character_vector),
“绿色”,
如果有(
颜色指示器==“黄色”&
(!str_detect(示例_character_vector,“Full”)| is.na(示例_character_vector)),
“黄色”,
“红色”
)
)
)
)
#>示例字符向量颜色指示器覆盖颜色指示器
#>1基本绿色
#>2绿色
#>3全黄绿色
#>4无黄色
#>5黄-黄
#>6无红色
#>7红色

但在
时一定要使用
case\u

@CalumYou我很感谢你的贡献,但我一般建议在编辑别人答案中的代码时稍微轻一点。请记住这一点。很抱歉覆盖:我不想重复,我已经写了同样的内容。
  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
  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