Мне нужно перекодировать набор данных тестовых ответов для использования в другом приложении (программе под названием 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
глаголов для этого. Что меня сбивает с толку, так это необходимость изолировать определенные ячейки в определенных строках, которые нужно перекодировать.
Заранее благодарю за любую помощь!