R 具有多列和多个条件的if语句

R 具有多列和多个条件的if语句,r,if-statement,dplyr,R,If Statement,Dplyr,通过以下示例数据,我试图基于三列变量(type、addict和sex)的值创建一个新变量“category” 但是我想把类型和成瘾者分为一组,把性分为另一组。 因此,我使用any从逻辑上得到一组逻辑向量,其中至少有一个值为真,或者两个值都为真 df <- data.frame(type = c(NA, "bad",NA), addict=c('visky','wine',NA), sex=c(NA,'male',NA)) >

通过以下示例数据,我试图基于三列变量(type、addict和sex)的值创建一个新变量“category”

但是我想把
类型
成瘾者
分为一组,把
分为另一组。 因此,我使用
any
从逻辑上得到一组逻辑向量,其中至少有一个值为真,或者两个值都为真

df <- data.frame(type = c(NA, "bad",NA), addict=c('visky','wine',NA),
                 sex=c(NA,'male',NA))


> df
  type addict  sex
1 <NA>  visky <NA>
2  bad   wine male
3 <NA>   <NA> <NA>

library(dplyr)


df%>%
  mutate(category=ifelse(any(is.na(type)&addict=="visky")&any(is.na(sex)),"categ1",
         ifelse(any(type=="bad"|addict=="wine")&any(!is.na(sex)),"categ2",
         ifelse(any(is.na(type)&is.na(addict))&any(is.na(sex)),"categ3",NA))))

            
       type addict  sex category
1 <NA>  visky <NA>   categ1
2  bad   wine male   categ1
3 <NA>   <NA> <NA>   categ1
提前Thx

用户定义功能的更新
类别
如果我想在不使用case_的情况下编写用户定义函数,那么还有一件事我可能会使用

categ <- function(type,addict,sex){ 

if (any(is.na(type)&addict=="visky"&is.na(sex))){ 
"categ1" 
} 
else{ 
NA 
} 

}
categ%
变异(类别=类别(类型、上瘾者、性别))
类型成瘾性分类
1 visky categ1
2个坏葡萄酒男性类别1
3类1

在OP的输入数据集中,所有列都是
因子
,与之一起的
NA
s是字符串
“NA”
。此外,OP的代码正在使用
any
检查整个列,该列返回单个
TRUE/FALSE
,并被回收,而这不是预期的输出。如果我们将它们更改为
character
类和
NA
s(使用
case\u时

数据
df With
==
如果存在
NA
元素,则返回为NA。因此,您可能需要一个
&
is.na
以及它。因此,当您在第一个条件中使用
any
包装时,输出是一个TRUE/FALSE,可以循环使用across@akrun我认为is.na应该返回
TRUE
。使用
&
is.na
是什么意思?你能显示预期的输出吗?@akrun所以any(TRUE&TRUE)和any(TRUE)都应该返回TRUE,我想?我修复了关于错误融合的操作。还有一件事,如果我想编写用户定义函数而不使用
case\u,当
执行我通常使用的相同操作时,我在OP.for user defined category函数下添加了这一部分@Alexander是否仅使用
ifelse
?或者它是一种不同的功能,我是说,
ifelse
对我来说更自然,更喜欢它;)@Alexander我的意思是关于条件,即使用
any
if
或者条件应该是
ifelse(is.na(type)&addict==“viskey”&is.na(sex),“categ”,na)
categ <- function(type,addict,sex){ 

if (any(is.na(type)&addict=="visky"&is.na(sex))){ 
"categ1" 
} 
else{ 
NA 
} 

}
df%>%
mutate(category=categ(type,addict,sex))

  type addict  sex category
1 <NA>  visky <NA>   categ1
2  bad   wine male   categ1
3 <NA>   <NA> <NA>   categ1
df %>% 
  mutate(category = case_when(
            is.na(type) & addict %in% "visky" & is.na(sex) ~ "categ1",
            type %in% c("bad", "wine") & !is.na(sex) ~ "categ2", 
            is.na(type) & is.na(addict) & is.na(sex) ~ "categ3", 
            TRUE ~ NA_character_))
#   type addict  sex category
#1 <NA>  visky <NA>   categ1
#2  bad   wine male   categ2
#3 <NA>   <NA> <NA>   categ3
categFn <- function(typeCol, addictCol, sexCol) {

           if(any(is.na(typeCol) & addictCol== "visky") & any(is.na(sexCol))) {
               "categ1"
              } else NA
            }

df %>% 
     mutate(categ = categFn(type, addict, sex))
df <- data.frame(type = c(NA, "bad",NA), addict=c('visky','wine',NA),
                  sex=c(NA,'male',NA), stringsAsFactors = FALSE)