1

如果缺少 var2,我需要创建一个类似于 var1 的变量,如果 var1 为空,则类似于 var2,如果两者没有丢失,则创建 var1 和 var 2 的平均值 ((var1+var2)/2),最后如果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。

4

2 回答 2

2
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
    )
)
于 2019-10-05T17:42:30.573 回答
1

几乎就在那里,只是一些小的编辑,它正在为我工​​作。通常最好使用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  
于 2019-10-05T17:41:08.567 回答