Как вставить то же значение, которое соответствует условиям, в новый столбец в R

#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 ) ко всем записям в одном блоке (как определено выше).