#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