Возвращение значения из определенного столбца в data.frame - PullRequest
0 голосов
/ 12 июня 2018

У меня есть data.frame из 14 столбцов, составленных из результатов тестов за 13 периодов времени, все числовые.В последнем столбце, скажем, X, указан конкретный момент времени, когда каждый учащийся (строки) получил неудовлетворительную оценку.Я хотел бы создать отдельную колонку, в которой будут указаны результаты тестов каждого учащегося, исходя из их конкретного времени неудачи.

      dataframe<-data.frame(TestA=c(58,92,65,44,88), 
      TestB=c(17,22,58,46,98), 
      TestC=c(88,98,2,45,80), TestD=c(33,25,65,66,5), 
      TestE=c(98,100,100,100,100), X=c(2,2,3,NA,4))

Выше приведена сжатая версия с фиктивными данными.Первый ученик потерпел неудачу в момент два и т. Д., Но четвертый ученик никогда не проигрывалРезультирующий столбец должен быть 17,2 2, 2, NA, 5. Как я могу это сделать?

Ответы [ 2 ]

0 голосов
/ 12 июня 2018

Два альтернативных решения.

Один использует map функцию из purrr пакета

library(tidyverse)

dataframe %>%
  group_by(student_id = row_number()) %>%
  nest() %>%
  mutate(fail_score = map(data, ~c(.$TestA, .$TestB, .$TestC, .$TestD, .$TestE)[.$X])) %>%
  unnest()

# # A tibble: 5 x 8
#   student_id fail_score TestA TestB TestC TestD TestE     X
#        <int>      <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
# 1          1         17    58    17    88    33    98     2
# 2          2         22    92    22    98    25   100     2
# 3          3          2    65    58     2    65   100     3
# 4          4         NA    44    46    45    66   100    NA
# 5          5          5    88    98    80     5   100     4

А другой использует rowwise

dataframe %>%
  rowwise() %>%
  mutate(fail_score = c(TestA, TestB, TestC, TestD, TestE)[X]) %>%
  ungroup()

# # A tibble: 5 x 7
#   TestA TestB TestC TestD TestE     X fail_score
#   <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>      <dbl>
# 1    58    17    88    33    98     2         17
# 2    92    22    98    25   100     2         22
# 3    65    58     2    65   100     3          2
# 4    44    46    45    66   100    NA         NA
# 5    88    98    80     5   100     4          5

Я публикую оба, потому что у меня есть ощущение, что подход map будет быстрее, если у вас много учеников (то есть строк) и тестов (то есть столбцов).

0 голосов
/ 12 июня 2018

Вы можете попробовать

dataframe[cbind(1:nrow(dataframe), dataframe$X)]
#[1] 17 22  2 NA  5

С ?`[`

Третья форма индексации - через числовую матрицу с одним столбцом для каждого измерения: каждая строкаИндексная матрица затем выбирает один элемент массива, и в результате получается вектор.Отрицательные индексы не допускаются в матрице индексов.Допустимы значения NA и ноль: строки индексной матрицы, содержащие ноль, игнорируются, тогда как строки, содержащие NA, дают в результате NA.

...