【问题标题】:Issues with multiple nested if-else in RR中多个嵌套if-else的问题
【发布时间】:2021-12-22 06:20:00
【问题描述】:

我在使用下面的代码时遇到问题,我不确定它为什么不起作用。

Q16a Q16c Q17
2 NA 31
2 NA 28
1 26 NA
1 29 NA
1 32 NA
1 25 NA
1 25 NA
Ech_final_nom_BSA <- Ech_final_nom_BSA %>%
  mutate(Moins_23_eleves = ifelse(Q16a==1,
                                  ifelse(!is.na(Q16c),ifelse(Q16c<=22,1,0),
                                          NA),
                                          ifelse(!is.na(Q17),ifelse(Q17<=22,1,0),NA
                                              )))

因此,当 Q17Q16c 低于 23 但我不希望时,我希望变量 Moins_23_eleves 等于 1 NA 值等于 0。上面的代码有效,但仍将 NA 视为 0。

table(Ech_final_nom_BSA$Moins_23_eleves, useNA = "always")
0 1 NA
1076 597 0

我做错了什么?

谢谢!

【问题讨论】:

  • 您给了我们预期的输出,但没有给我们输入。这让生活变得艰难......
  • 感谢您的回答。我已经更新了问题。
  • 说实话,我不太明白你的问题。如果我们在您提供的数据上运行您的第一段代码,我们会得到一个仅包含零的列 Moins_23_eleves(这是合乎逻辑的,因为在列 Q16cQ17 中没有小于 23 的值,并且存在总是在任一列中的值)。如果该列仅包含零,则意味着它不包含 NA。那么,为什么你会期望table() 函数生成的dataframe 的NA 列的值不是0?
  • 您好,是的,我明白您的意思。也有 Q16c 和 Q17 都是 NA 的情况。在这种情况下,我希望它们保持 NA 而不是变成 0。
  • 好的。感谢您的澄清。在这种情况下,请使用库data.table 找到可能的解决方案(参见下面的答案)。干杯。

标签: r if-statement dplyr


【解决方案1】:

我建议您使用包data.table 的解决方案。所以请在下面找到reprex。

Reprex

  • 您修改后的数据(获取所有案例)
m <- "Q16a  Q16c    Q17
2   NA  31
2   NA  28
1   NA  NA
1   29  NA
1   22  NA
1   25  NA
1   25  NA"

Ech_final_nom_BSA <- read.table(text = m, header = TRUE)
  • 代码
library(data.table)

Ech_final_nom_BSA <- setDT(Ech_final_nom_BSA)[, Moins_23_eleves := fcase(Q16a == 1 & Q16c < 23 | Q16a == 1 & Q17 < 23, 1,
                                                                         Q16a == 1 & Q16c >= 23 | Q16a == 1 &Q17 >= 23, 0,
                                                                         default = NA)][]
  • 输出
Ech_final_nom_BSA 
#>    Q16a Q16c Q17 Moins_23_eleves
#> 1:    2   NA  31              NA
#> 2:    2   NA  28              NA
#> 3:    1   NA  NA              NA
#> 4:    1   29  NA               0
#> 5:    1   22  NA               1
#> 6:    1   25  NA               0
#> 7:    1   25  NA               0
  • 检查table()
table(factor(Ech_final_nom_BSA$Moins_23_eleves, levels = 0:1) , useNA = "always")
#> 
#>    0    1 <NA> 
#>    3    1    3

reprex package 创建于 2021-11-10 (v2.0.1)


编辑

dplyr 库的解决方案

Reprex

  • 您修改后的数据(获取所有案例)
m <- "Q16a  Q16c    Q17
2   NA  31
2   NA  28
1   NA  NA
1   29  NA
1   22  NA
1   25  NA
1   25  NA"
Ech_final_nom_BSA <- read.table(text = m, header = TRUE)
  • 代码
library(dplyr)

Ech_final_nom_BSA <- Ech_final_nom_BSA %>%
  mutate(Moins_23_eleves = case_when(Q16a==1 & Q16c <= 22 | Q16a == 1 & Q17 <= 22 ~ 1,
                                     Q16a==1 & Q16c > 22 | Q16a == 1 & Q17 > 22 ~ 0)
         )
  • 输出
Ech_final_nom_BSA 
#>   Q16a Q16c Q17 Moins_23_eleves
#> 1    2   NA  31              NA
#> 2    2   NA  28              NA
#> 3    1   NA  NA              NA
#> 4    1   29  NA               0
#> 5    1   22  NA               1
#> 6    1   25  NA               0
#> 7    1   25  NA               0
  • 检查table()
table(factor(Ech_final_nom_BSA$Moins_23_eleves, levels = 0:1) , useNA = "always")
#> 
#>    0    1 <NA> 
#>    3    1    3

reprex package (v2.0.1) 于 2021 年 11 月 10 日创建

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-17
    • 1970-01-01
    • 1970-01-01
    • 2013-03-08
    相关资源
    最近更新 更多