r dplyr结合了mutate_at,vars(ends_with),ifelse,!is.na

时间:2019-03-13 10:05:59

标签: r if-statement dplyr mutate ends-with

嗨,我有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`

1 个答案:

答案 0 :(得分:1)

使用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")))))