Распределенная переменная по нескольким столбцам в dplyr

#r #dplyr

#r #dplyr

Вопрос:

Допустим, у меня есть следующий набор данных:

 df <- read.table(header=TRUE, text="
politics_collapse question_id mean_confidence mean_accuracy mean_importance
Democrat arms_manufacturing_company 24.00000 0.0000000 1.000000
Democrat black_panther 48.50000 0.0000000 1.500000
Democrat stranger_things_universe 55.50000 0.2500000 2.500000
Democrat the_office 37.66667 0.6666667 1.666667
Democrat tupac 80.33333 1.0000000 2.000000
Democrat uber_ceo 39.60000 0.8000000 2.600000
Republican arms_manufacturing_company 37.00000 1.0000000 1.000000
Republican black_panther 45.00000 1.0000000 2.000000
Republican stranger_things_universe 33.00000 1.0000000 3.000000")
  

Я пытаюсь распределить politics_collapse столбец по mean_confidence, mean_accuracy, and mean_importance столбцам. Результирующим результатом будет иметь mean_confidence_democrat , mean_accuracy_democrat , и mean_importance_democrat … и то же самое для республиканца.

Итак, вот так:

 df <- read.table(header=TRUE, text="
question_id mean_confidence_democrat mean_accuracy_democrat mean_importance_democrat mean_confidence_republican mean_accuracy_republican mean_importance_republican
arms_manufacturing_company 
black_panther 
stranger_things_universe 
the_office 
tupac 
uber_ceo 
arms_manufacturing_company 
black_panther 
stranger_things_universe")
  

Где, очевидно, в каждой из строк будут числовые значения.

Я наткнулся на эту виньетку здесь: https://community.rstudio.com/t/spread-with-multiple-value-columns/5378 что предполагает использование совершенно новых «сводных функций», но я не мог понять, как заставить их работать. Я также пытался вложить значения, распределить их и отменить вложенность, но это не сработало.

Комментарии:

1. Не могли бы вы показать, как выглядят ваши данные в настоящее время и во что вы хотели бы их преобразовать? Картинка (скопированный вывод) стоит тысячи слов (иногда).

2. Мой набор данных выглядит точно так же, как тот, который я опубликовал…

Ответ №1:

Возможно, это то, что вы ищете:

 library(tidyverse)

df %>%
  gather("metric", "score", mean_confidence, mean_accuracy, mean_importance) %>%
  mutate(metric = paste0(metric, "_", politics_collapse)) %>%
  select(-politics_collapse) %>%
  spread(metric, score)

                 question_id mean_accuracy_Democrat mean_accuracy_Republican mean_confidence_Democrat mean_confidence_Republican mean_importance_Democrat
1 arms_manufacturing_company              0.0000000                        1                 24.00000                         37                 1.000000
2              black_panther              0.0000000                        1                 48.50000                         45                 1.500000
3   stranger_things_universe              0.2500000                        1                 55.50000                         33                 2.500000
4                 the_office              0.6666667                       NA                 37.66667                         NA                 1.666667
5                      tupac              1.0000000                       NA                 80.33333                         NA                 2.000000
6                   uber_ceo              0.8000000                       NA                 39.60000                         NA                 2.600000
  mean_importance_Republican
1                          1
2                          2
3                          3
4                         NA
5                         NA
6                         NA
  

Ответ №2:

Пока новые pivot функции не будут официально выпущены, вот простой способ сделать это с помощью tidyr :

 df %>% 
    tidyr::gather(variable, value, mean_confidence, mean_accuracy, mean_importance) %>%
    tidyr::unite(new_columns, politics_collapse, variable) %>%
    tidyr::spread(new_columns, value)
  

Предоставление:

                  question_id Democrat_mean_accuracy Democrat_mean_confidence Democrat_mean_importance Republican_mean_accuracy Republican_mean_confidence Republican_mean_importance
1 arms_manufacturing_company              0.0000000                 24.00000                 1.000000                        1                         37                          1
2              black_panther              0.0000000                 48.50000                 1.500000                        1                         45                          2
3   stranger_things_universe              0.2500000                 55.50000                 2.500000                        1                         33                          3
4                 the_office              0.6666667                 37.66667                 1.666667                       NA                         NA                         NA
5                      tupac              1.0000000                 80.33333                 2.000000                       NA                         NA                         NA
6                   uber_ceo              0.8000000                 39.60000                 2.600000                       NA                         NA                         NA