сопоставить значение с именем столбца, чтобы создать новую переменную в R - PullRequest
0 голосов
/ 11 мая 2018

У меня есть набор данных, который выглядит следующим образом

    students <- data.frame(name = c("student1", "student2", "student3", "student4"),
                   test1 = c(50, 30, 20, 6),
                   test2 = c(30, 20, 15, 10),
                   select = c("test2", "test1", "test2", "test1"))

Есть ли способ создать новую переменную с именем 'grade', которая будет содержать результаты тестов любой переменной, отображаемой в 'select'?

Пример вывода здесь:

    students <- data.frame(name = c("student1", "student2", "student3", "student4"),
                   test1 = c(50, 30, 20, 6),
                   test2 = c(30, 20, 15, 10),
                   select = c("test2", "test1", "test2", "test1"),
                   grade = c(30, 30, 15, 6))

Ответы [ 3 ]

0 голосов
/ 11 мая 2018

Если вы хотите сделать это в базе R, и у вас есть только небольшое количество тестов для выбора, вы можете сделать это с кодом:

students$Grade[students$select=="test1"] <- as.numeric(students$test1[students$select=="test1"])
students$Grade[students$select=="test2"] <- as.numeric(students$test2[students$select=="test2"])

Результат:

      name test1 test2 select Grade
1 student1    50    30  test2    30
2 student2    30    20  test1    30
3 student3    20    15  test2    15
4 student4     6    10  test1     6
0 голосов
/ 11 мая 2018

Вот простое решение base-R ...

students$grade <- sapply(1:nrow(students),
                         function(i) students[i, as.character(students$select[i])])

students
      name test1 test2 select grade
1 student1    50    30  test2    30
2 student2    30    20  test1    30
3 student3    20    15  test2    15
4 student4     6    10  test1     6

Или, чтобы ответить на следующий вопрос в комментариях - чтобы справиться с записями типа "test1, test2", вы можете сделать

students$grade <- sapply(1:nrow(students),
                  function(i) paste(students[i,                                   
                                   trimws(unlist(strsplit(students$select[i], ",")))],
                                    collapse=", "))

Это в основном берет каждую строку и разделяет select на запятые, обрезает пробелы, а затем вставляет результирующие значения grade вместе.

Итак, если students$select[1] равно "test1, test2" в приведенном выше, это производит

students
      name test1 test2       select  grade
1 student1    50    30 test1, test2 50, 30
2 student2    30    20        test1     30
3 student3    20    15        test2     15
4 student4     6    10        test1      6

Обратите внимание, что столбец grade теперь будет переведен в формат character

.
0 голосов
/ 11 мая 2018

Вот решение Base R:

students$value = with(students, ifelse(select == 'test1', test1, test2))

или case_when из dplyr:

library(dplyr)

students %>%
  mutate(value = case_when(
    select == 'test1' ~ test1, 
    TRUE ~ test2))

Это решение также распространяется на n тесты.

Результат:

      name test1 test2 select value
1 student1    50    30  test2    30
2 student2    30    20  test1    30
3 student3    20    15  test2    15
4 student4     6    10  test1     6
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...