首页 > 解决方案 > 根据另一个因素的水平改变一个因素的水平

问题描述

我有一个包含许多变量的数据集,其中两个称为“动物”和“植物”。两个变量都是因子,并且都是二元的,即它们要么是文本值,要么是 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

当植物的值为“ivy”而动物的值为“猫”时,我想将植物的值更改为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

我真的很感激任何帮助。我确信有一种非常简单的方法可以做到这一点,也许我看不到树木的树木。

标签: rdataframeif-statementna

解决方案


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

推荐阅读