繁体   English   中英

R,如果具有多个条件的字符向量具有多个条件,则为R

[英]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.ACol.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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM