r - внутришкольная вензоризация

У меня есть формат данных в длинном формате data.set, в котором каждый предмет имеет разные числовые значения (data.set$target_resp.rtв соответствии с условиями. Я уже обработал мои данные по общему критерию, используя функцию DescTool Winsorize (см. здесь для информации):

overall.criterion.2sd <- data.set$overall.mean+(2*data.set$overall.sd)
winsors.2 <- DescTools::Winsorize(data.set$target_resp.rt, maxval=overall.criterion.2sd[1])

Выше можно было определить maxval в качестве первого значения переменной overall.criterion.2sd, поскольку это одинаковые значения для всех предметов. Теперь я хотел бы winsorize мои данные по предмету, то есть мне нужно запустить внутрисубъектную построчную винсоризацию. Вот моя попытка, с criterion.2sd это просто вектор из N значений (N= № предметов):

criterion.2sd <- data.set$rt.mean+(2*data.set$rt.sd)
within.winsors.2 <- data.set %>% group_by(Nome, Cognome) %>%
                                    Winsorize(data.set$target_resp.rt, maxval=unique(criterion.2sd))

Появляется следующая ошибка:

Ошибка в [<-.data.frame(*tmp*, x

Я понимаю, что что-то не так, кардинальность maxval переменная, но я не могу понять, как это исправить. Кто-нибудь может помочь?

Вот образец набора данных data.set (надеюсь, этого достаточно; дайте мне знать, если это правильный формат):

   subject        target_resp.rt   rt.mean     rt.sd
 1 1              1.0398901        0.9016781   0.3109358
 2 1              0.6887729        0.9016781   0.3109358
 3 1              0.7691720        0.9016781   0.3109358
 4 1              1.0064900        0.9016781   0.3109358
 5 1              0.8195999        0.9016781   0.3109358
 6 2              0.8410320        1.0500845   0.4210796
 7 2              0.8229311        1.0500845   0.4210796
 8 2              0.9250839        1.0500845   0.4210796
 9 2              1.0085750        1.0500845   0.4210796
10 2              1.1406291        1.0500845   0.4210796
11 3              0.5561039        0.749789    0.2350127
12 3              0.6022139        0.749789    0.2350127
13 3              0.8560688        0.749789    0.2350127
14 3              0.5886030        0.749789    0.2350127
15 3              0.5520449        0.749789    0.2350127

1 ответ

Решение

Это проблема со смешанным синтаксисом dplyr. В исходном вопросе вы передаете вектор Winsorize, но data.set %>% group_by(Nome, Cognome) это набор данных и труба (%>%) передает весь набор данных первому аргументу Winsorizeзначит ты действительно звонишь

Winsorize(x = data.set, minval = ..., maxval = ...)

То, что вы действительно хотите, это использовать mutate после group_by изменить target_resp.rt; синтаксис выглядит так:

data.set %>% group_by(subject) %>%
  mutate(target_winsorized = Winsorize(target_resp.rt, maxval=unique(overall.criterion.2sd))

Это создает новую переменную в наборе данных target_winsorized со свойствами, которые вы хотите. В будущем вы также можете сохранить overall.criterion.2sd внутри набора данных тоже.

Документы

Проверьте dplyr документы, если хотите узнать больше о синтаксисе и dplyr стиль.

Другие вопросы по тегам