Заказать столбцы в dcast - PullRequest
0 голосов
/ 05 сентября 2018

Как указать порядок столбцов на основе столбца 'Col' при использовании dcast?

df <- dcast(x, ID ~ ColumnName, value.var = "Answer")

Мне нужно, чтобы решение не было специфичным для данных, так как x может быть результатом любого вопроса (таким образом, Col может быть 1-3 или 1-2 и т. Д.). Два фиктивных примера ниже x.

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



ID        Answer        ColumnName        Col
1         The Kirin Tor Quest             1
1         90            Level             2
2         Emissary      Quest             1
2         38            Level             2

Ответы [ 2 ]

0 голосов
/ 13 сентября 2018

Это плохо документировано ни в 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")
0 голосов
/ 05 сентября 2018

Я не вижу аргумента dcast, который позволяет указывать окончательный порядок столбцов, но всегда можно установить результат на подмножество.

fun_dcast <- function(DF, formula = ID ~ ColumnName, value.var = "Answer"){
  reshape2::dcast(DF, formula, value.var = value.var)[c(1, 1 + unique(DF[["Col"]]))]
}

fun_dcast(x1)
#  ID  Faction First Name    Surname
#1  1 Alliance     Anduin      Wrynn
#2  2    Horde   Sylvanas Windrunner

fun_dcast(x2)
#  ID Level         Quest
#1  1    90 The Kirin Tor
#2  2    38      Emissary

Данные.

x1 <- read.table(text = "
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
", header = TRUE)


x2 <- read.table(text = "
ID        Answer        ColumnName        Col
1         'The Kirin Tor' Quest             1
1         90            Level             2
2         Emissary      Quest             1
2         38            Level             2
", header = TRUE)
...