Это плохо документировано ни в help("dcast", "reshape2")
, ни в help("dcast", "data.table")
, но столбцы упорядочены по уровням факторов, если ColumnName
является фактором.
Без factor()
Столбцы расположены в алфавитном порядке, что не соответствует порядку, указанному в Col
reshape2::dcast(x, ID ~ ColumnName, value.var = "Answer")
ID Faction First Name Surname
1 1 Alliance Anduin Wrynn
2 2 Horde Sylvanas Windrunner
С уровнями факторов, упорядоченными по внешнему виду
Очевидно, что OP использует Col
для нумерации ColumnName
в порядке появления. Таким образом, Col
является избыточным и может быть проигнорировано.
Существует несколько способов создания уровней факторов, упорядоченных по внешнему виду непосредственно в формуле dcast()
:
База R
reshape2::dcast(x1, ID ~ factor(ColumnName, levels = unique(ColumnName)), value.var = "Answer")
ID First Name Surname Faction
1 1 Anduin Wrynn Alliance
2 2 Sylvanas Windrunner Horde
reshape2::dcast(x2, ID ~ factor(ColumnName, levels = unique(ColumnName)), value.var = "Answer")
ID Quest Level
1 1 The Kirin Tor 90
2 2 Emissary 38
В соответствии с запросом OP решение не относится к данным.
forcats
Пакет forcats
имеет несколько удобных функций для работы с факторами. as_factor()
создает уровни в том порядке, в котором они появляются:
reshape2::dcast(x1, ID ~ forcats::as_factor(ColumnName), value.var = "Answer")
(результат такой же, как указано выше.)
Чтобы сделать код более явным, можно использовать fct_inorder()
:
reshape2::dcast(x1, ID ~ forcats::fct_inorder(ColumnName), value.var = "Answer")
С уровнями факторов, упорядоченными по Col
В случае, если запрашиваемый порядок столбцов отличается от порядка появления, столбцы могут быть упорядочены по уровням факторов, которые получены из Col
. Для демонстрации используется модифицированный образец набора данных.
С основанием R,
reshape2::dcast(x3, ID ~ reorder(factor(ColumnName), Col), value.var = "Answer")
ID Surname Faction First Name
1 1 Wrynn Alliance Anduin
2 2 Windrunner Horde Sylvanas
или с forcats
reshape2::dcast(x3, ID ~ forcats::fct_reorder(ColumnName, Col), value.var = "Answer")
Данные
x1 <- readr::read_table(
"ID Answer ColumnName Col
1 Anduin First Name 1
1 Wrynn Surname 2
1 Alliance Faction 3
2 Sylvanas First Name 1
2 Windrunner Surname 2
2 Horde Faction 3")
x2 <- data.table::fread(
'ID Answer ColumnName Col
1 "The Kirin Tor" Quest 1
1 90 Level 2
2 Emissary Quest 1
2 38 Level 2')
Модифицированный набор образцов данных с заданным порядком столбцов (кроме порядка появления или в алфавитном порядке):
x3 <- readr::read_table(
"ID Answer ColumnName Col
1 Anduin First Name 3
1 Wrynn Surname 1
1 Alliance Faction 2
2 Sylvanas First Name 3
2 Windrunner Surname 1
2 Horde Faction 2")