R 具有多列和多个条件的if语句
通过以下示例数据,我试图基于三列变量(type、addict和sex)的值创建一个新变量“category” 但是我想把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)) >
类型
和成瘾者
分为一组,把性
分为另一组。
因此,我使用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)