使用 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/