#r #data-wrangling
Вопрос:
ИЗМЕНИТЬ: случайно в строке блока кода был определен стимул, поэтому он не отображался.
У меня есть проблема, которую я не знаю, как решить. Любая помощь будет очень признательна. В принципе, у меня есть некоторые данные, которые я хочу переформатировать таким образом, чтобы получить значение, соответствующее определенным критериям, из отдельной ячейки и повторить его для каждого из экземпляров данного условия.
Ниже у меня есть воссозданный игрушечный пример этой проблемы:
stimulus lt;- c("instructions","happy", "sad", "anger", "instructions", "happy", "sad", "anger", "instructions", "happy", "sad", "anger") test_part lt;- c("comprehension", "emotion", "emotion", "emotion", "comprehension", "emotion", "emotion", "emotion", "comprehension", "emotion", "emotion", "emotion") answer lt;- c(0, 1,3,5,0, 7,2,1, 0, 1,7,2) condition lt;- c(NA, "angry", "angry", "angry", NA, "happy", "happy", "happy", NA, "sad", "sad", "sad") id lt;-c(1,1,1,1,1,1,1,1,1,1,1,1) mydatalt;-data.frame(id, condition, test_part, stimulus, answer) head(mydata)
Вот настройка данных:
gt; head(mydata) id condition test_part stimulus answer 1 1 lt;NAgt; comprehension instructions 0 2 1 angry emotion happy 1 3 1 angry emotion sad 3 4 1 angry emotion anger 5 5 1 lt;NAgt; comprehension instructions 0 6 1 happy emotion happy 7
Мне нужен новый столбец для каждой строки «test_part» эмоций, который повторяет ответ на стимул, соответствующий условию. Так, например, мне сначала нужна новая переменная под названием AngryRating, которая берет значение «ответ» из строки, в которой есть гнев, и повторяет это значение для каждой строки этого условия (гнев), а затем повторяет следующее значение «ответ» из строки гнева для следующего условия (счастье) и так далее
Вот что я попытался сделать, чтобы ввести правильное значение в новый столбец/переменную:
mydata$AngryRating lt;- ifelse(mydata$stimulus == "anger" amp; mydata$test_part == "emotion", paste0(mydata$answer), NA) head(mydata)
gt; head(mydata) id condition test_part stimulus answer AngryRating 1 1 lt;NAgt; comprehension instructions 0 lt;NAgt; 2 1 angry emotion happy 1 lt;NAgt; 3 1 angry emotion sad 3 lt;NAgt; 4 1 angry emotion anger 5 5 5 1 lt;NAgt; comprehension instructions 0 lt;NAgt; 6 1 happy emotion happy 7 lt;NAgt;
Но здесь я получаю только одно значение для условия == гнев, test_part == эмоция и стимул == гнев. Но я хочу, чтобы это значение 5 было вставлено для всех строк, где условие == гнев (и следующее значение гнева для всех строк, где условие == счастье).
Подобный этому:
answerFormatted lt;-c(NA,5,5,5,NA,1,1,1, NA,2,2,2) mydesireddatalt;-data.frame(id, condition, test_part, stimulus, answer, answerFormatted) head(mydesireddata)
gt; head(mydesireddata) id condition test_part stimulus answer answerFormatted 1 1 lt;NAgt; comprehension instructions 0 NA 2 1 angry emotion happy 1 5 3 1 angry emotion sad 3 5 4 1 angry emotion anger 5 5 5 1 lt;NAgt; comprehension instructions 0 NA 6 1 happy emotion happy 7 1
Может быть, мне нужно зациклиться или что-то в этом роде, но я просто не уверен, как заставить значение повторяться при правильных условиях таким образом, чтобы оно было эффективным вообще. Опять же, любая помощь будет очень признательна!!
Комментарии:
1. Вы забыли дать определение
stimulus
.2. Спасибо @MartinGal! Я все исправил.
3. ваши блоки test_part, которые должны вызывать одинаковое раздражение, всегда разделены блоками понимания / инструкций?
Ответ №1:
Я не совсем уверен, что это то, что вы ищете. Вы можете использовать
library(dplyr) library(stringr) library(tidyr) mydata %gt;% group_by(id, grp = cumsum(is.na(condition)), grp2 = is.na(condition)) %gt;% mutate( AngryRating = ifelse( str_extract(condition, "^.{3}") == str_extract(stimulus, "^.{3}"), answer, NA_real_)) %gt;% fill(AngryRating, .direction = "updown") %gt;% ungroup() %gt;% select(-grp, grp2)
получить
# A tibble: 12 × 7 id condition test_part stimulus answer grp2 AngryRating lt;dblgt; lt;chrgt; lt;chrgt; lt;chrgt; lt;dblgt; lt;lglgt; lt;dblgt; 1 1 NA comprehension instructions 0 TRUE NA 2 1 angry emotion happy 1 FALSE 5 3 1 angry emotion sad 3 FALSE 5 4 1 angry emotion anger 5 FALSE 5 5 1 NA comprehension instructions 0 TRUE NA 6 1 happy emotion happy 7 FALSE 7 7 1 happy emotion sad 2 FALSE 7 8 1 happy emotion anger 1 FALSE 7 9 1 NA comprehension instructions 0 TRUE NA 10 1 sad emotion happy 1 FALSE 7 11 1 sad emotion sad 7 FALSE 7 12 1 sad emotion anger 2 FALSE 7
Что здесь происходит?
- Сначала мы группируем данные по
id
(исходя из предположения, что разныеid
s не должны смешиваться) и блоки данных с последовательными частями теста (они разделены условиями сNA
s). - Мы извлекаем значение из
answer
столбца, если условие и стимул совпадают. Посколькуangry
иanger
не одно и то же, мы сравниваем только первые три буквы. - Наконец, мы применяем этот ответ (
AngryRating
) ко всем записям в одном блоке (как определено выше).