[英]Change the level of a factor based on the level of another factor
我有一个包含许多变量的数据集,其中两个称为“动物”和“植物”。 两个变量都是因子,都是二元的,即它们要么是文本值,要么是 NA。
例如:
animal <- c(NA, NA, "cat", "cat", NA)
plant <- c("ivy", NA, "ivy", NA, NA)
value <- c(1:5)
df <- data.frame(animal, plant, value)
> df
animal plant value
1 <NA> ivy 1
2 <NA> <NA> 2
3 cat ivy 3
4 cat <NA> 4
5 <NA> <NA> 5
当植物的价值是“常春藤”而动物的价值是“猫”时,我想将植物的价值改为NA(即这两件事不能为真,动物价值优先。我不'我的其他变量没有任何变化
我尝试了以下操作,但收到一条错误消息:
df <- df %>% if (isTRUE(animal == "cat")) {plant==NA}
Error in if (.) isTRUE(animal == "cat") else { :
argument is not interpretable as logical
In addition: Warning message:
In if (.) isTRUE(animal == "cat") else { :
the condition has length > 1 and only the first element will be used
我的目标输出是:
> df
animal plant value
1 <NA> ivy 1
2 <NA> <NA> 2
3 cat <NA> 3
4 cat <NA> 4
5 <NA> <NA> 5
我真的很感激任何帮助。 我确信有一种非常简单的方法可以做到这一点,也许我只见树木不见森林。
library(dplyr)
df %>%
mutate(plant = case_when(animal == 'cat' & plant == 'ivy' ~ NA_character_,
TRUE ~ plant))
这给了我们:
animal plant value
1 <NA> ivy 1
2 <NA> <NA> 2
3 cat <NA> 3
4 cat <NA> 4
5 <NA> <NA> 5
你也可以这样做:
df[!(is.na(df$animal)|is.na(df$plant)),'plant'] <- NA
df
animal plant value
1 <NA> ivy 1
2 <NA> <NA> 2
3 cat <NA> 3
4 cat <NA> 4
5 <NA> <NA> 5
这也可以表示为:
df[!is.na(df$animal) & !is.na(df$plant),'plant'] <- NA
你的问题似乎比你想象的要简单。 您可以通过将所有植物(动物不是NA
)转换为NA
来实现相同的结果:
df$plant[!is.na(df$animal)] <- NA
或者更高级一点:
is.na(df$plant) <- !is.na(df$animal)
这里的问题是==
不适用于 R 中的NA
值。
> df[df$animal=="cat",]
animal plant value
NA <NA> <NA> NA
NA.1 <NA> <NA> NA
3 cat ivy 3
4 cat <NA> 4
NA.2 <NA> <NA> NA
例如,这里返回所有行,因为NA == "ANYTHING"
返回NA
。
您可以定义这个函数,如果x
和y
相等而不是NA
,或者两者都是NA
,则该函数返回TRUE
。
is.equal.force <- `%===%` <- function(x,y, vect=T) {
res <- ifelse(is.na(x),is.na(y),ifelse(!is.na(y)&!is.na(x),x==y, NA))
if(!vect){
res <- all(res)
}
return(res)
}
那么您的问题的解决方案就变得很简单:
df[df$animal%===%"cat"&df$plant%===%"ivy","plant"] <- NA
df
animal plant value
1 <NA> ivy 1
2 <NA> <NA> 2
3 cat <NA> 3
4 cat <NA> 4
5 <NA> <NA> 5
请注意,此处使用了正确的语法。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.