Мне нужно перекодировать набор данных тестовых ответов для использования в другом приложении (программе BLIMP, которая вменяет пропущенные значения). В частности, мне нужно представить тестовые элементы и назначения подшкалы с помощью фиктивных кодов.
Здесь я создаю фрейм данных, который содержит ответы на 10-элементный тест для двух человек во вложенном формате. Эти данные являются упрощенной версией фактической входной таблицы.
library(tidyverse)
df <- tibble(
person = rep(101:102, each = 10),
item = as.factor(rep(1:10, 2)),
response = sample(1:4, 20, replace = T),
scale = as.factor(rep(rep(1:2, each = 5), 2))
) %>% mutate(
scale_last = case_when(
as.integer(scale) != lead(as.integer(scale)) | is.na(lead(as.integer(scale))) ~ 1,
TRUE ~ NA_real_
)
)
Столбцы df
содержат:
person
: идентификационные номера лиц (10 строкдля каждого человека) item
: тестовые задания 1-10 для каждого человека. Обратите внимание, как элементы вложены в каждого человека. response
: оценка для каждого элемента scale
: тест имеет две подшкалы. Элементы 1-5 назначены подшкале 1, а элементы 6-10 - подшкале 2. scale_last
: код 1
в этом столбце указывает, что элемент является последним элементом в егоназначенная подшкала. Эта характеристика становится важной ниже.
Затем я создаю фиктивные коды для элементов, используя пакет recipes
.
library(recipes)
dum <- df %>%
recipe(~ .) %>%
step_dummy(item, one_hot = T) %>%
prep(training = df) %>%
bake(new_data = df)
print(dum, width = Inf)
# person response scale scale_last item_X1 item_X2 item_X3 item_X4 item_X5 item_X6 item_X7
# <int> <int> <fct> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
# 1 101 2 1 NA 1 0 0 0 0 0 0
# 2 101 3 1 NA 0 1 0 0 0 0 0
# 3 101 3 1 NA 0 0 1 0 0 0 0
# 4 101 1 1 NA 0 0 0 1 0 0 0
# 5 101 1 1 1 0 0 0 0 1 0 0
# 6 101 1 2 NA 0 0 0 0 0 1 0
# 7 101 3 2 NA 0 0 0 0 0 0 1
# 8 101 4 2 NA 0 0 0 0 0 0 0
# 9 101 2 2 NA 0 0 0 0 0 0 0
#10 101 4 2 1 0 0 0 0 0 0 0
#11 102 2 1 NA 1 0 0 0 0 0 0
#12 102 1 1 NA 0 1 0 0 0 0 0
#13 102 2 1 NA 0 0 1 0 0 0 0
#14 102 3 1 NA 0 0 0 1 0 0 0
#15 102 2 1 1 0 0 0 0 1 0 0
#16 102 1 2 NA 0 0 0 0 0 1 0
#17 102 4 2 NA 0 0 0 0 0 0 1
#18 102 2 2 NA 0 0 0 0 0 0 0
#19 102 4 2 NA 0 0 0 0 0 0 0
#20 102 3 2 1 0 0 0 0 0 0 0
# item_X8 item_X9 item_X10
# <dbl> <dbl> <dbl>
# 1 0 0 0
# 2 0 0 0
# 3 0 0 0
# 4 0 0 0
# 5 0 0 0
# 6 0 0 0
# 7 0 0 0
# 8 1 0 0
# 9 0 1 0
#10 0 0 1
#11 0 0 0
#12 0 0 0
#13 0 0 0
#14 0 0 0
#15 0 0 0
#16 0 0 0
#17 0 0 0
#18 1 0 0
#19 0 1 0
#20 0 0 1
В выходных данных отображаются фиктивные коды элементов, представленные в столбцахс префиксом item_
. Для последующей обработки мне нужен дополнительный уровень перекодирования. В пределах каждой подшкалы элементы должны быть фиктивно закодированы относительно последнего элемента подшкалы. Вот где в игру вступает переменная scale_last
;эта переменная определяет строки в выводе, которые необходимо перекодировать.
Например, первая из этих строк - строка 5, строка для последнего элемента (элемент 5) в подшкале 1 для человека 101. Вв этой строке значение столбца item_X5
необходимо перекодировать с 1
до 0
. В следующей строке, которую необходимо перекодировать (строка 10), это значение item_X10
, которое необходимо перекодировать с 1
до 0
. И так далее.
Я борюсь за правильную комбинацию dplyr
глаголов для достижения этой цели. Меня сбивает с толку необходимость выделять определенные ячейки в определенных строках для перекодирования.
Заранее спасибо за любую помощь!