【问题标题】:Recoding a variable by a double conditional in dplyr using mutate and case_when使用 mutate 和 case_when 在 dplyr 中通过双重条件重新编码变量
【发布时间】:2019-10-11 14:17:25
【问题描述】:

当现场工作人员观察在哪些地点 (Siteid) 种植了哪些树种 (SORTNR) 时,我正在尝试纠正在现场所犯的错误。不幸的是,不同站点所犯的错误并不相同。

我想在我的代码中表达的是:当 Siteid 和 SORTNR 是特定组合时,将 SORTNR 替换为正确的值。但是,当我随后检查数据时,所有 SORTNR 都是 NA。

如果我将其分解并仅运行一个重新编码块,则似乎调用中未包含的组合的变量 SORTNR 设置为 NA,并且运行这两个块将导致所有组合设置为不。

如何防止未提及的组合更改为 NA?我们可以不必明确声明我想用它们自己替换正确的值吗?

样本数据:

Siteid <- c(rep("F410", 10), "F411","F411","F411","F411","F411")
SORTNR <- c(1,2,4,5,8,9,10,11,12,2,12,14,28,15,12)
Dataframe <- data.frame(cbind(Siteid,SORTNR))

重新编码

#Recoding Block 1
Dataframe <- Dataframe %>% mutate(SORTNR=case_when(
  Siteid=="F410" & SORTNR==1~2,
  Siteid=="F410" & SORTNR==2~2,
  Siteid=="F410" & SORTNR==4~28,
  Siteid=="F410" & SORTNR==5~28,
  Siteid=="F410" & SORTNR==8~28,
  Siteid=="F410" & SORTNR==9~28,
  Siteid=="F410" & SORTNR==10~27,
  Siteid=="F410" & SORTNR==11~28,
  Siteid=="F410" & SORTNR==12~28))

#Recoding Block 2
Dataframe <- Dataframe %>% mutate(SORTNR=case_when(
 Siteid=="F411" & SORTNR==12~13,
 Siteid=="F411" & SORTNR==28~29,
 Siteid=="F411" & SORTNR==14~14,
 Siteid=="F411" & SORTNR==15~15

【问题讨论】:

    标签: r dplyr conditional-statements recode


    【解决方案1】:

    case_when() 语句中不匹配的值被分配NA,因此您需要使用TRUE ~ SORTNR 作为最终条件来避免这种情况。

    library(dplyr)
    
    Dataframe %>%
      mutate(SORTNR = case_when(Siteid=="F410" & SORTNR %in% c(1,2) ~ 2,
                                Siteid=="F410" & SORTNR %in% c(4,5,8,9,11,12) ~ 28,
                                Siteid=="F410" & SORTNR == 10 ~ 27,
                                Siteid=="F411" & SORTNR == 12 ~ 13,
                                Siteid=="F411" & SORTNR == 28 ~ 29,
                                Siteid=="F411" & SORTNR == 14 ~ 14,
                                Siteid=="F411" & SORTNR == 15 ~ 15,
                                TRUE ~ SORTNR))
    

    【讨论】:

    • 感谢您的解决!只是为了我正确理解这一点,TRUE~SORTNR 读取:如果有一个值,SORTNR?
    • LHS 上的参数必须解析为一个逻辑值,所以是的,它表示任何不匹配任何早期条件的情况都应该分配SORTNR 的值。跨度>
    猜你喜欢
    • 2019-01-08
    • 2020-01-27
    • 1970-01-01
    • 2021-10-18
    • 1970-01-01
    • 1970-01-01
    • 2021-04-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多