r - 在 dcast 中对列进行排序

标签 r reshape2 dcast

使用 dcast 时,如何根据列“Col”指定列顺序?

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

最佳答案

它没有很好的记录,也没有在 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 的要求,该解决方案并非特定于数据。
forcatsforcats包有一些方便的功能来处理因素。 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")

关于r - 在 dcast 中对列进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52190674/

相关文章:

r - 在 R Markdown YAML 中包含 css 文件的文件路径

R Shiny : Compiling RMarkdown Documents with Download Buttons in Data Table

r - 创建一个不包含重复整数的所有九位数字的矩阵

r - 在melt/gather 中为新列指定类

r - 与时间融化

r - 可以在没有聚合函数的情况下使用 dcast 吗?

r - 表示多个组的多个列

r - 在 Shiny 的仪表板标题上放置一个下拉按钮以进行主题选择

r - dcast 数据框没有给出正确的列