首页 > 解决方案 > R - 根据其他 3 列中的 NA 有条件地创建新列

问题描述

我有一个包含 Estuarine、Freshwater 和 Marine 列的数据集。我想根据其他列中的 NA 数量创建 Status 列:

Brackish Freshwater Marine  Status
1         NA         1       Marine_Estuarine
1         1          1       Marine_Estuarine_Freshwater
NA        NA         1       Marine_Only
NA        1          1       Marine_Freshwater

我尝试编写此代码以有条件地填充该列,但我收到一个错误,大多数行都被标记为 Marine_Only,即使它们在淡水或河口有 1。我认为“&”会将 Marine_Only 限制为在河口和淡水中具有 NA 的行。

library(dplyr)

df<-df %>%
  mutate(Status = case_when(
    is.na(df$brackish & df$freshwater) ~ "Marine_Only",
    !is.na(df$brackish & df$freshwater) ~ "Marine_Estuarine_and_Freshwater",
    !is.na(df$brackish) ~ "Brackish",
    !is.na(df$freshwater) ~ "Freshwater"))

标签: rna

解决方案


假设列名是正确的。is.na可以分别在每一列中应用,然后执行&代替brackish & freshwater。对于 > 0 的任何值,后者可以为 TRUE,即

> 1 & 2
[1] TRUE
> 0 & 2
[1] FALSE

使用上述逻辑,创建如下复合逻辑表达式

df <- df %>%
    mutate(Status = case_when(
          is.na(brackish) & is.na(freshwater) ~ "Marine Only",
          !is.na(brackish) & !is.na(freshwater)
                      ~ "Marine_Estuarine_and_Freshwater",
          !is.na(brackish) ~ "Brackish",
          !is.na(freshwater) ~ "Freshwater"))

推荐阅读