[英]R if else with multiple conditions for character vectors with NAs
我知道有很多标题相似的问题,但是我无法为我的情况创建可行的解决方案。 我有几个结合了文本和NA值的向量;
DATA <- data.frame("Col.A" = c("Some Text", "Some other text", "Yes", "No", "no",
NA, "No", "Yes", "yes", NA, NA, NA), "Col.B" = c(NA, NA, "Green", NA, NA, NA, NA,
"Blue", "Blue 2", NA, NA, NA))
我需要检查Col.A
包含“是”,“是”,“否”或“否”。 如果不是,那么我要将Col.A
文本复制到Col.B
。 如果它具有这四个条件中的任何一个,我想保留Col.B
。
我可以使其与单个ifelse
语句一起使用(因此,仅满足条件之一),但是当我尝试包括多个条件时,它只是将所有文本从Col.A
到Col.B
(即,包括“是”和“否”条目,抹去了我想保留在Col.B
。
DATA$Col.B <- if_else((DATA$Col.A != "Yes" | (DATA$Col.A != "yes") |
(DATA$Col.A != "No") | (DATA$Col.A != "no")) , DATA$Col.B, DATA$Col.A)
和链接,否则
if(DATA$Col.A == "Yes"){
DATA$Col.B <- DATA$Col.B
} else if(DATA$Col.A == "yes"){
DATA$Col.B <- DATA$Col.B
} else if(DATA$Col.A == "No"){
DATA$Col.B <- DATA$Col.B
} else if(DATA$Col.A == "no"){
DATA$Col.B <- DATA$Col.B
} else {
DATA$Col.B <- DATA$Col.A
}
但是没有运气。 任何指针表示赞赏!
tidyverse
方法
library(tidyverse)
DATA %>%
mutate_if(is.factor, as.character) %>%
mutate(Col.B = if_else(Col.A %in% c("Yes", "yes", "No", "no"), Col.B, Col.A))
# Col.A Col.B
#1 Some Text Some Text
#2 Some other text Some other text
#3 Yes Green
#4 No <NA>
#5 no <NA>
#6 <NA> <NA>
#7 No <NA>
#8 Yes Blue
#9 yes Blue 2
#10 <NA> <NA>
#11 <NA> <NA>
#12 <NA> <NA>
在基础R中使用grepl
transform(DATA, Col.B = ifelse(
grepl("([Yy]es|[Nn]o)", Col.A),
as.character(Col.B), as.character(Col.A)))
或类似tidyverse
使用方法%in%
与tolower
(感谢@DJV)
transform(DATA, Col.B = ifelse(
tolower(Col.A) %in% c("yes", "no"),
as.character(Col.B), as.character(Col.A)))
使用基础R:您可以使用grepl
DATA = rapply(DATA,as.character,"factor",how="replace")#CHANGE FACTOR COLUMNS TO CHARACTER
transform(DATA,Col.B=ifelse(grepl("\\b(Yes|no)\\b",Col.A,ignore.case = T),Col.B,Col.A))
Col.A Col.B
1 Some Text Some Text
2 Some other text Some other text
3 Yes Green
4 No <NA>
5 no <NA>
6 <NA> <NA>
7 No <NA>
8 Yes Blue
9 yes Blue 2
10 <NA> <NA>
11 <NA> <NA>
12 <NA> <NA>
如我的评论所述,我将!=
更改为==
并获得与其他答案相同的结果,并且与您的原始问题中所述相同。
DATA <- data.frame("Col.A" = c("Some Text", "Some other text", "Yes", "No", "no",
NA, "No", "Yes", "yes", NA, NA, NA), "Col.B" = c(NA, NA, "Green", NA, NA, NA, NA,
"Blue", "Blue 2", NA, NA, NA),stringsAsFactors = FALSE)
DATA$newCol.B <- ifelse((DATA$Col.A == "Yes" | (DATA$Col.A == "yes") |
(DATA$Col.A == "No") | (DATA$Col.A == "no")) , DATA$Col.B, DATA$Col.A)
DATA
#> Col.A Col.B newCol.B
#> 1 Some Text <NA> Some Text
#> 2 Some other text <NA> Some other text
#> 3 Yes Green Green
#> 4 No <NA> <NA>
#> 5 no <NA> <NA>
#> 6 <NA> <NA> <NA>
#> 7 No <NA> <NA>
#> 8 Yes Blue Blue
#> 9 yes Blue 2 Blue 2
#> 10 <NA> <NA> <NA>
#> 11 <NA> <NA> <NA>
#> 12 <NA> <NA> <NA>
由reprex软件包 (v0.2.0)于2018-07-18创建。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.