0

嗨,我有 10 个具有相同结尾的变量,我正在尝试使用 mutate_at 根据这些变量中的数据创建一个新变量并将其分配回数据帧。如果任何以“xyz”结尾的变量都有数据(即不是 NA),那么我想分配值的计数,否则为 NA。

df %<>% mutate_at(vars(ends_with("xyz")), funs(new_var = ifelse(!is.na(), 1, NA)))

上面的代码给出了一个错误,需要 !is.na() 的参数,但 vars 参数需要一个函数。我该如何结合这个?

编辑:这是可重现的示例和所需的输出:

`# A tibble: 6 x 6
       1_abc    1_xyz     2_abc      2_xyz     3_abc   3_xyz
1       NA        1          NA          1        NA      NA
2       NA       NA          NA         NA        NA      NA 
3       NA       NA          NA          1        NA      NA
4       NA       NA          NA         NA        NA      NA
5       NA       NA          NA         NA        NA      NA 
6       NA        1          NA         NA        NA      NA`

所需的输出将是一个变量,例如 xyz_num,如果所有 _xyz 变量都是 NA,则值将为 NA;如果任何 _xyz 变量不是 NA,则为非空变量的计数。

`# A tibble: 6 x 7
       1_abc    1_xyz     2_abc      2_xyz     3_abc   3_xyz   xyz_num
1       NA        1          NA          1        NA      NA         2      
2       NA       NA          NA         NA        NA      NA        NA
3       NA       NA          NA          1        NA      NA         1
4       NA       NA          NA         NA        NA      NA        NA
5       NA       NA          NA         NA        NA      NA        NA
6       NA        1          NA         NA        NA      NA         1`
4

1 回答 1

3

dplyr你可以尝试类似

df1 %>%
  select(ends_with("_xyz")) %>%
  mutate(nnums = rowSums(!is.na(.)))

假设输入是

structure(list(X1_abc = c(NA, NA, NA, NA, NA, NA), X1_xyz = c(1, 
NA, NA, NA, NA, 1), X2_abc = c(NA, NA, NA, NA, NA, NA), X2_xyz = c(1, 
NA, 1, NA, NA, NA), X3_abc = c(NA, NA, NA, NA, NA, NA), X3_xyz = c(NA, 
NA, NA, NA, NA, NA)), class = "data.frame", row.names = c(NA, 
-6L))

它返回

  X1_xyz X2_xyz X3_xyz nnums
1      1      1     NA     2
2     NA     NA     NA     0
3     NA      1     NA     1
4     NA     NA     NA     0
5     NA     NA     NA     0
6      1     NA     NA     1

我希望您可以修改代码以保留您想要的列。

编辑1:

要保留所有列,请尝试

df1 %<>%
  mutate(nnums = rowSums(!is.na(select(df1, ends_with("_xyz")))))
于 2019-03-13T14:31:18.947 回答