【发布时间】:2020-02-25 03:36:32
【问题描述】:
好的,我知道fct_reorder() 允许您根据另一列重新排序因子,但据我所知,您必须提供一些在第二列上运行的函数(平均值、中位数等)知道如何 对列进行排序。但是,如果您有另一列按照您希望列的水平/排序方式按原样进行排序,该怎么办?
例如,我有一个列 ACADEMIC_PERIOD_DESC 用英语给出学年:“Fall 2019”、“Spring 2020”等,我有一个对应的列 ACADEMIC_PERIOD,它是一个数字代码对应学年:“201940”、“202020”等。这是我要ACADEMIC_PERIOD_DESC拉平的栏目。
数据
df <- structure(list(ACADEMIC_PERIOD = c("200810", "200820", "200830",
"200840", "200910", "200920", "200930", "200940", "201010", "201020"
), ACADEMIC_PERIOD_DESC = structure(1:10, .Label = c("J-Term 2008",
"Spring 2008", "Summer 2008", "Fall 2008", "J-Term 2009", "Spring 2009",
"Summer 2009", "Fall 2009", "J-Term 2010", "Spring 2010", "Summer 2010",
"Fall 2010", "J-Term 2011", "Spring 2011", "Summer 2011", "Fall 2011",
"J-Term 2012", "Spring 2012", "Summer 2012", "Fall 2012", "J-Term 2013",
"Spring 2013", "Summer 2013", "Fall 2013", "Spring 2014", "Summer 2014",
"Fall 2014", "J-Term 2015", "Spring 2015", "Summer 2015", "Fall 2015",
"J-Term 2016", "Spring 2016", "Summer 2016", "Fall 2016", "J-Term 2017",
"Spring 2017", "Summer 2017", "Fall 2017", "J-Term 2018", "Spring 2018",
"Summer 2018", "Fall 2018", "J-Term 2019", "Spring 2019", "Summer 2019",
"Fall 2019", "J-Term 2020", "Spring 2020"), class = "factor")), class = c("tbl_df",
"tbl", "data.frame"), row.names = c(NA, -10L))
即使不必要地应用中位数,我是否应该只执行以下操作?
df %>%
mutate(ACADEMIC_PERIOD_DESC = fct_reorder(ACADEMIC_PERIOD_DESC, as.integer(ACADEMIC_PERIOD)))
我也知道我可以像这样使用 base R:
df$ACADEMIC_PERIOD_DESC <- reorder(df$ACADEMIC_PERIOD_DESC, df$ACADEMIC_PERIOD)
有没有更优雅的 forcats/tidyverse 解决方案?我只是错过了什么吗?
谢谢!
【问题讨论】:
-
如果你做这个reproducible会有帮助。如果您已经订购了数据或可以轻松订购数据并且只希望有一列遵循该顺序,您可以使用
fct_inorder。或者,如果您在另一列中有唯一值,则取平均值实际上并不重要——mean(c(5))是 5 -
@camille 我刚刚添加了一些数据。是的,对于唯一值,是的,一个数字的平均值就是那个数字,但是在 forcats 中是否有更简单的东西?喜欢根据此列按原样重新排序,因为它们是独一无二的?
-
不是。清楚为什么
fct_reorder(ACADEMIC_PERIOD_DESC, as.integer(ACADEMIC_PERIOD))不优雅 -
@akrun 我想它很优雅,只是它取了
ACADEMIC_PERIOD的平均值,我不需要它。 -
.fun默认是median,可以改成I