Разделите столбец фиктивной переменной на два столбца со сводной статистикой - PullRequest
0 голосов
/ 23 июня 2018

У меня есть простой вопрос, но я не могу понять, как достичь желаемого результата в dplyr / tidyr.

Я только что вычислил итоговый фрейм данных следующим образом:

results <- df_long %>%
  group_by(question,imputed_liberal, question_text) %>% 
  summarize(Accuracy = mean(score, na.rm = T), Reaction_Time = mean(reation_time, na.rm = T), Number = n()) 

Каждый вопрос повторяется в двух строках, одна для imputed_liberal = T, другая для imputed_liberal = F и столбцы для точностии время реакции

   question imputed_liberal question_text Accuracy Reaction_Time Number                                                         

 1 10       F               How many...    0.750       61.4     16
 2 10       T               How many...    0.429       55.9     14

Я хотел бы свести обе эти строки в одну (поэтому по одной строке на вопрос) со столбцами «консервативная точность» (вменяется либерал = F), «либеральная точность», «консервативная реакция».время "и" либеральное время реакции ".

Я подумал, что spread был правильным подходом, но не смог понять, как распределить по двум значениям (точность и время реакции).

моя попытка:

results <- results %>% 
           filter(!is.na(Accuracy)) %>%
           spread(results, key = imputed_liberal, value = c(Accuracy, Reaction_time))

Выдает ошибку, потому что вы не можете иметь два значения в спреде.

Ответы [ 2 ]

0 голосов
/ 23 июня 2018

Вот стандартный tidyr способ:

library(tidyverse)
df %>%
  select(-Number) %>%
  mutate(imputed_liberal = ifelse(imputed_liberal,1,0)) %>%
  gather(,,Accuracy, Reaction_Time) %>%
  unite(key,key,imputed_liberal) %>%
  spread(key,value)

#   question question_text Accuracy_0 Accuracy_1 Reaction_Time_0 Reaction_Time_1
# 1       10   How many...       0.75      0.429            61.4            55.9

Вы также можете сначала вложить, чтобы было меньше гимнастики:

df %>%
  select(-Number) %>%
  nest(Accuracy, Reaction_Time) %>%
  spread(imputed_liberal,data) %>%
  unnest(.sep = "_")

#   question question_text FALSE_Accuracy FALSE_Reaction_Time TRUE_Accuracy TRUE_Reaction_Time
# 1       10   How many...           0.75                61.4         0.429               55.9
0 голосов
/ 23 июня 2018

Один вариант заключается в том, что вы разделяете на две части и объединяете эти две части вместе.

library(dplyr)

inner_join(filter(results, imputed_liberal), 
    filter(results, !imputed_liberal), by="question") %>%
     select(-Number.y)

Результат:

Примечание: Можно переименовать столбцы по своему выбору.

# question imputed_liberal.x question_text.x Accuracy.x Reaction_Time.x Number.x imputed_liberal.y question_text.y Accuracy.y Reaction_Time.y
# 1       10              TRUE     How many...      0.429            55.9       14             FALSE     How many...       0.75            61.4

Данные:

results <- read.table(text =
"question imputed_liberal question_text Accuracy Reaction_Time Number  
1 10       FALSE               'How many...'    0.750       61.4     16
2 10       TRUE               'How many...'    0.429       55.9     14",
header = TRUE, stringsAsFactors = FALSE)
...