gpt4 book ai didi

r - 在 dcast 中对列进行排序

转载 作者:行者123 更新时间:2023-12-04 14:53:15 26 4
gpt4 key购买 nike

使用 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 的要求,该解决方案并非特定于数据。
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")

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

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com