【问题标题】:Sorting R Data Frame in a Specified Order按指定顺序对 R 数据帧进行排序
【发布时间】:2020-08-28 10:56:54
【问题描述】:

假设我有(非常简单的例子):

df <- data.frame(factor_name  = c("fac_Y", "fac_Y", "fac_Y", "fac_X", "fac_X", "fac_X", "fac_X", "fac_X", "fac_X"),
                 factor_level = c("cherry", "apple", "peach", 2, 1, 3, 4, 6, 8),
                 value        = c(1, 3, 2, 6, 3, 4, 1, 5, 2))

我需要根据factor_namefactor_leveldf 进行排序不依赖字母/数字顺序(因为在我正在处理的更复杂的情况下,排序顺序是与这些事情完全无关)这样:

(i) factor_name 应该排序为(fac_X, fac_Y)

(ii) 在fac_X 内,factor_level 排序顺序应为(1, 2, 3, 4, 6, 8)

(iii) 在fac_Y 内,factor_level 排序顺序应为("apple", "peach", "cherry")

所以我需要手动提供有关我想要的顺序的信息(即上面的 (i)-(iii)),但我不确定该怎么做。

因此我希望我的输出是:

df_sorted <- data.frame(factor_name  = c("fac_X", "fac_X", "fac_X", "fac_X", "fac_X", "fac_X", "fac_Y", "fac_Y", "fac_Y"),
                        factor_level = c(1, 2, 3, 4, 6, 8, "apple", "peach", "cherry"),
                        value        = c(3, 6, 4, 1, 5, 2, 3, 2, 1))

有人可以帮忙吗? 谢谢。

【问题讨论】:

  • 也可以:df[order(df$factor_name,df$factor_level,df$value),]

标签: r sorting


【解决方案1】:

你可以在定义correct_order之后使用match

library(dplyr)

correct_order <- c(1, 2, 3, 4, 6, 8, "apple", "peach", "cherry")
df %>% arrange(factor_name, match(factor_level, correct_order))

#  factor_name factor_level value
#1       fac_X            1     3
#2       fac_X            2     6
#3       fac_X            3     4
#4       fac_X            4     1
#5       fac_X            6     5
#6       fac_X            8     2
#7       fac_Y        apple     3
#8       fac_Y        peach     2
#9       fac_Y       cherry     1

您可以在基础 R order 中使用相同的:

df[with(df, order(factor_name, match(factor_level, correct_order))), ]

请注意,correct_order 应该首先具有 "fac_X" 的值,然后是 "fac_Y",这并不重要。只要它们之间的值保持不变,它就可以按任何顺序排列。所以上面的答案会给出相同的输出:

correct_order <- c("apple", "peach", "cherry", 1, 2, 3, 4, 6, 8)

【讨论】:

  • 我认为这可行(并且在我刚刚尝试过的更复杂的示例中仍然有效)。谢谢。
【解决方案2】:

我们可以使用factor 指定levels

library(dplyr)
df %>% 
  arrange(factor_name, factor(factor_level,
      levels = c(1, 2, 3, 4, 6, 8, 'apple', 'peach', 'cherry')))
#   factor_name factor_level value
#1       fac_X            1     3
#2       fac_X            2     6
#3       fac_X            3     4
#4       fac_X            4     1
#5       fac_X            6     5
#6       fac_X            8     2
#7       fac_Y        apple     3
#8       fac_Y        peach     2
#9       fac_Y       cherry     1

【讨论】:

  • 这不依赖于能够以与fac_X 相同的顺序对fac_Y 进行排序吗?一般来说,我无法在这里做出这样的假设。每个因素都有自己特定的顺序。
  • @Alan 您是否有完全不同的关卡,或者您是否有其中一个与另一个相反的情况
  • 完全不同 - 将修改 OP 以更清晰地显示
  • 啊,是的,好的,我现在可以看到逻辑了。我明天再玩这个。谢谢。
猜你喜欢
  • 2012-06-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-20
  • 2021-09-17
  • 1970-01-01
相关资源
最近更新 更多