r dplyr, объединяющий mutate_at, vars (end_with), ifelse,! is.na - PullRequest
0 голосов
/ 13 марта 2019

Привет, у меня есть 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, где значения будут NA, если все переменные _xyz равны 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 Ответ

1 голос
/ 13 марта 2019

с 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")))))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...