【问题标题】:Can't create variable conditioned on NA values of other 2 variables无法创建以其他 2 个变量的 NA 值为条件的变量
【发布时间】:2019-10-05 17:32:45
【问题描述】:

如果缺少 var2,我需要创建一个类似于 var1 的变量,如果 var1 为空,则类似于 var2,如果两者不缺少,则 var1 和 var 2 的平均值 ((var1+var2)/2) 和最后 NA 如果 var1 和 var2 也都丢失了。

我有如下数据:

    library(tidyverse)

    df <- tibble(
    var1 = c(1, 2, 3, 4, NA, NA, 3, 2),
    var2 = c(3, 5, NA, 2, 3, NA, 4, NA)
    )

结果应该是:

    var1  var2   newvar
    1      3      2
    2      5      3.5
    3      NA     3 
    4      2      3
    NA     3      3
    NA     NA     NA
    3      4      3.5
    2      NA     2 

我尝试过使用主要的 R 重新编码函数,也尝试过使用 case_when:

df <- df %>% mutate (
newvar = case_when(
var1 == NA ~ var2,
var2 == NA ~ var1,
TRUE   ~ (var1+var2)/2
)
)

不确定最后一行是否正确,但无论如何代码由于缺失而无法工作,它说:

mutate_impl(.data, dots) 中的错误: 评估错误:下标作业中不允许使用 NA。

【问题讨论】:

    标签: r dplyr na


    【解决方案1】:
    df %>% mutate (
        newvar = case_when(
            xor(is.na(var1), is.na(var2)) ~ pmax(var1, var2, na.rm = TRUE),
            !is.na(var1) & !is.na(var2) ~ (var1 + var2)/2,
            TRUE ~ NaN
        )
    )
    

    【讨论】:

    • 仅代码的答案被认为是低质量的:请务必说明您的代码的作用以及它如何解决问题。
    【解决方案2】:

    几乎完成了,只是一些小的编辑,它正在我的工作中。通常最好使用is.na(x) 而不是x == NA。此外,最后你的TRUE 应该检查你真正想要的,如果它们都不是NA

    df %>% mutate (
      newvar = case_when(
        is.na(var1) ~ var2,
        is.na(var2) ~ var1,
        !is.na(var1) && !is.na(var2)   ~ (var1+var2)/2
      )
    )
    

    生产

    # A tibble: 8 x 3
       var1  var2 newvar
      <dbl> <dbl>  <dbl>
    1     1     3    2  
    2     2     5    3.5
    3     3    NA    3  
    4     4     2    3  
    5    NA     3    3  
    6    NA    NA   NA  
    7     3     4    3.5
    8     2    NA    2  
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-04-20
      • 2015-05-25
      • 2019-08-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-21
      相关资源
      最近更新 更多