【问题标题】:ifelse is recoding text, but not NAs — I need to recode bothifelse 正在重新编码文本,但不是 NA - 我需要重新编码两者
【发布时间】:2023-03-24 00:12:01
【问题描述】:

我正在尝试将主要包含 NA 和一些文本条目的变量重新编码为具有两个文本条目之一(作为因子)的变量。目前,变量的条目是“失败”或 NA。例如,

AttentionCheck (variable/column)
NA
NA
NA
Fail
NA
NA
Fail
NA

我认为我可以使用 ifelse 告诉 R 将所有“失败”条目更改为更具体的条目(“注意检查失败(N = 17)”)并将 NA 更改为“通过...”。所以想要的输出如下。

AttentionCheck (variable/column)
Passed...
Passed...
Passed...
Failed Att...
Passed...
Passed...
Failed Att...
Passed...

但是,以下 ifelse 代码(和支持代码)不会产生所需的重新编码。具体来说,它无法重命名 NA。

> StatVsInd1$AttentionCheck <- as.factor(StatVsInd1$AttentionCheck)
> summary(StatVsInd1$AttentionCheck) # use this to complete the Ns for Pass and fail in next lines
Fail NA's 
  17  246 
> StatVsInd1$AttentionCheck <- ifelse(StatVsInd1$AttentionCheck=="Fail",
+                                     "Failed Attention Check (N = 17)",
+                                     "Passed Attention Check (N = 246)")
> StatVsInd1$AttentionCheck <- as.factor(StatVsInd1$AttentionCheck)
> summary(StatVsInd1$AttentionCheck)
Failed Attention Check (N = 17)                            NA's 
                             17                             246

我还(未成功)尝试使用 ifelse 使用以下代码更直接地查找和更改 NA:

StatVsInd1$AttentionCheck <- ifelse(StatVsInd1$AttentionCheck==NA,
                                    "Passed Attention Check (N = 246)",
                                    "Failed Attention Check (N = 17)")

我以为这是我通常重新编码因子的方式,但显然我错了。

欢迎任何建议。

【问题讨论】:

  • 尝试使用is.na() 而不是==NA

标签: r if-statement recode


【解决方案1】:

您可以使用 dplyr 中的 recode 使用 .missing 参数,然后将其转换为因子:

library(dplyr)
#> 
#> Attaching package: 'dplyr'
#> The following objects are masked from 'package:stats':
#> 
#>     filter, lag
#> The following objects are masked from 'package:base':
#> 
#>     intersect, setdiff, setequal, union
attn <- c(NA, NA, NA, "Fail", NA, NA, "Fail", NA)
factor(recode(attn, .missing = "Passed...", "Fail"="Failed Att..."))
#> [1] Passed...     Passed...     Passed...     Failed Att... Passed...    
#> [6] Passed...     Failed Att... Passed...    
#> Levels: Failed Att... Passed...

由reprex package (v0.3.0) 于 2020-07-01 创建

【讨论】:

    【解决方案2】:

    John Harley's comment 工作。具体来说,以下代码产生了所需的输出:

    > StatVsInd1$AttentionCheck <- ifelse(is.na(StatVsInd1$AttentionCheck),
    +                                     "Passed Attention Check (N = 246)",
    +                                     "Failed Attention Check (N = 17)")
    > StatVsInd1$AttentionCheck <- as.factor(StatVsInd1$AttentionCheck)
    > summary(StatVsInd1$AttentionCheck)
     Failed Attention Check (N = 17) Passed Attention Check (N = 246) 
                                  17                              246
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-07-07
      • 1970-01-01
      • 2015-03-28
      • 1970-01-01
      • 2019-06-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多