R dplyr вложенное фиктивное кодирование - PullRequest
1 голос
/ 10 ноября 2019

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

Заранее спасибо за любую помощь!

1 Ответ

1 голос
/ 10 ноября 2019

Мы можем использовать mutate_at и replace значения от "item" столбцов до 0, где scale_last == 1

library(dplyr)

dum %>% mutate_at(vars(starts_with("item")), ~replace(., scale_last == 1, 0))

# A tibble: 20 x 14
#   person response scale scale_last item_X1 item_X2 item_X3 item_X4 item_X5
#    <int>    <int> <fct>      <dbl>   <dbl>   <dbl>   <dbl>   <dbl>   <dbl>
# 1    101        2 1             NA       1       0       0       0       0
# 2    101        3 1             NA       0       1       0       0       0
# 3    101        1 1             NA       0       0       1       0       0
# 4    101        1 1             NA       0       0       0       1       0
# 5    101        3 1              1       0       0       0       0       0
# 6    101        4 2             NA       0       0       0       0       0
# 7    101        4 2             NA       0       0       0       0       0
# 8    101        3 2             NA       0       0       0       0       0
# 9    101        2 2             NA       0       0       0       0       0
#10    101        4 2              1       0       0       0       0       0
#11    102        2 1             NA       1       0       0       0       0
#12    102        1 1             NA       0       1       0       0       0
#13    102        4 1             NA       0       0       1       0       0
#14    102        4 1             NA       0       0       0       1       0
#15    102        4 1              1       0       0       0       0       0
#16    102        3 2             NA       0       0       0       0       0
#17    102        4 2             NA       0       0       0       0       0
#18    102        1 2             NA       0       0       0       0       0
#19    102        4 2             NA       0       0       0       0       0
#20    102        4 2              1       0       0       0       0       0
# … with 5 more variables: item_X6 <dbl>, item_X7 <dbl>, item_X8 <dbl>,
#   item_X9 <dbl>, item_X10 <dbl>

В базе R мы можем использовать lapply

cols <- grep("^item", names(dum))
dum[cols] <- lapply(dum[cols], function(x) replace(x, dum$scale_last == 1, 0))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...