R - копировать значения из ячеек в пустые ячейки в тех же столбцах

У меня есть набор данных с ответами на шкалу Лайкерта и временем реакции, которые являются результатами экспериментальных манипуляций. В идеале я хотел бы скопировать значения Likert_Answer и привести их в соответствие с экспериментальными манипуляциями, связанными с этим значением.

Набор данных выглядит следующим образом:

x <- rep(c(NA, round(runif(5, min=0, max=100), 2)), times=3)

myDF <- data.frame(ID = rep(c(1,2,3), each=6),
               Condition = rep(c("A","B"), each=3, times=3),
               Type_of_Task = rep(c("Test", rep(c("Experiment"), times=2)), times=6),
               Likert_Answer = c(5, NA, NA, 6, NA, NA, 1, NA, NA, 5, NA, NA, 5, NA, NA, 1, NA, NA),
               Reaction_Times = x)

Мне очень сложно сформулировать проблему, которая у меня есть, поэтому мой ожидаемый результат должен выглядеть так:

myDF_Output <- data.frame(ID = rep(c(1,2,3), each=6),
               Condition = rep(c("A","B"), each=3, times=3),
               Type_of_Task = rep(c("Test", rep(c("Experiment"), times=2)), times=6),
               Likert_Answer = rep(c(5, 6, 1, 5, 5, 1), each = 3),
               Reaction_Times = x)

Я видел в этот пост возможное решение, которое заключается в следующем:

library(dplyr)
library(tidyr)

myDF2 <- myDF %>% 
  group_by(ID) %>% 
  fill(Likert_Answer) %>% 
  fill(Likert_Answer, .direction = "up")

Проблема в том, что это решение справедливо до тех пор, пока человек отвечает шкале Лайкерта. Если бы это было не так, я боюсь, что это решение затянет результат шкалы Лайкерта предыдущего экспериментального условия. Например:

myDF_missing <- myDF
myDF_missing[4,4] = NA

myDF3 <- myDF_missing %>% 
  group_by(ID) %>% 
  fill(Likert_Answer) %>% 
  fill(Likert_Answer, .direction = "up")

В этом случае то, что должно было быть NA в Likert_Scales для всех значений в условии B для ID 1, стало 5. Есть идеи, как этого избежать?

(Извините, если код грязный: я новичок в R, и я усердно учусь... Но на этом этапе я довольно застрял с этой проблемой.)


person Lucas    schedule 19.11.2020    source источник


Ответы (1)


если я правильно понял вашу проблему, вы очень близки к решению. Я манипулировал демо df, чтобы показать, как работает группировка:

library(dplyr)
library(tidyr)

myDF <- data.frame(ID = rep(c(1,2,3), each=6),
                   Condition = rep(c("A","B"), each=3, times=3),
                   Type_of_Task = rep(c("Test", rep(c("Experiment"), times=5)), times=3),
                   Likert_Answer = c(5, NA, NA, 6, NA, NA, 1, NA, NA, 5, NA, NA, NA, NA, NA, 1, NA, NA),
                   Reaction_Times = x)


myDF %>% 
  dplyr::group_by(ID) %>% 
  tidyr::fill(Likert_Answer)

      ID Condition Type_of_Task Likert_Answer Reaction_Times
   <dbl> <chr>     <chr>                <dbl>          <dbl>
 1     1 A         Test                     5           NA  
 2     1 A         Experiment               5           18.4
 3     1 A         Experiment               5           41.1
 4     1 B         Experiment               6           59.8
 5     1 B         Experiment               6           93.4
 6     1 B         Experiment               6           38.5
 7     2 A         Test                     1           NA  
 8     2 A         Experiment               1           18.4
 9     2 A         Experiment               1           41.1
10     2 B         Experiment               5           59.8
11     2 B         Experiment               5           93.4
12     2 B         Experiment               5           38.5
13     3 A         Test                    NA           NA  
14     3 A         Experiment              NA           18.4
15     3 A         Experiment              NA           41.1
16     3 B         Experiment               1           59.8
17     3 B         Experiment               1           93.4
18     3 B         Experiment               1           38.5
person DPH    schedule 19.11.2020
comment
С вашим ответом я только что понял, что сделал что-то не так в своем коде, чтобы объяснить свою проблему! Первая ячейка в Type_of_Task, соответствующая условию B, должна быть Test, а не Experiment. Я отредактирую и постараюсь внести ясность. Извини за это! - person Lucas; 20.11.2020
comment
Я исправил код и отредактировал вопрос сейчас. Я надеюсь, что теперь моя проблема более ясна для понимания. По сути, я хочу, чтобы значения в столбце были заполнены для одного и того же идентификатора, но также и для одного и того же условия. Таким образом, если, например, участник ID1 не отвечает по шкале Лайкерта для условия B, этот результат остается NA и не заполняется результатом теста для условия A. - person Lucas; 20.11.2020
comment
@Lucas: вы должны использовать две переменные для группировки: myDF_missing %›% dplyr::group_by(ID, Condition) %›% tidyr::fill(Likert_Answer) - person DPH; 23.11.2020