Создать переменную с условиями для других нескольких переменных - PullRequest
1 голос
/ 16 апреля 2020

Я пытаюсь создать переменную с условиями для нескольких других переменных.

Например, у меня есть 5 переменных, A, B, C, D, E , Они варьируются от 1 до 8.

Я хочу создать новую переменную grade с условиями ниже.

1) Если какая-либо из переменных (A до E) ниже 2 балл будет 1

2) если все переменные больше 3, а любая из переменных находится между 3, 4, оценка будет 2.

3), если все переменных больше 5, оценка будет 3.

Я создаю набор данных test произвольно.

test<-data.frame(A=c(4,7,4,1,4),
                 B=c(8,8,6,5,8),
                 C=c(6,5,6,7,5),
                 D=c(7,8,7,5,8),
                 E=c(5,7,8,5,5))

test

В этом случае grade будет 2,3, 2,1,2.

Я попробовал функцию mutate_at с функциями vars и one_of. Однако, это не вернуло то, что я ожидал.

test<-test%>%mutate_at(
  vars(one_of("A","B","C","D","E")),
  funs(grade=case_when(. %in% c(1,2)~1,
                       min(.) %in% c(3,4)~2,
                       min(.) %in% c(5,6,7,8)~3)))

test

  A B C D E A_grade B_grade C_grade D_grade E_grade
1 4 8 6 7 5      NA       3       3       3       3
2 7 8 5 8 7      NA       3       3       3       3
3 4 6 6 7 8      NA       3       3       3       3
4 1 5 7 5 5       1       3       3       3       3
5 4 8 5 8 5      NA       3       3       3       3

Буду признателен за всю вашу помощь.

1 Ответ

0 голосов
/ 16 апреля 2020

Вы можете использовать новую версию dplyr, установленную через remotes::install_github("tidyverse/dplyr") и новую c_across, чтобы легко получить то, что вы хотите. Обратите внимание, что результат не имеет 3, потому что я интерпретировал ваши логики c как > 5, а не >= 5.

library(dplyr)

test<-data.frame(A=c(4,7,4,1,4),
                 B=c(8,8,6,5,8),
                 C=c(6,5,6,7,5),
                 D=c(7,8,7,5,8),
                 E=c(5,7,8,5,5))

test %>%
  rowwise() %>%
  mutate(grade = case_when(
    sum(c_across(A:E) < 2) > 0 ~ 1,
    sum(c_across(A:E) > 5) == 5 ~ 3,
    TRUE ~ 2
  ))
#> # A tibble: 5 x 6
#> # Rowwise: 
#>       A     B     C     D     E grade
#>   <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
#> 1     4     8     6     7     5     2
#> 2     7     8     5     8     7     2
#> 3     4     6     6     7     8     2
#> 4     1     5     7     5     5     1
#> 5     4     8     5     8     5     2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...