如何按R中的多列对数据帧的一部分进行排序?

如何按R中的多列对数据帧的一部分进行排序?,r,dataframe,sorting,R,Dataframe,Sorting,排序在这里已经讨论了很多,但我有一个特别的问题。我有一个数据框(df)和几个列。所有的观测都属于三种类型中的一种,比如C1、C2和C3。在各种列中,有一列包含一个我称之为频率(f)的值。示例df: Type freq Val C3. 0.34. 10-A C1. 0.90. 4-A C2. 0.40. 5-B C1. 0.65. 3-C C2. 0.77. 5-D C3. 0.11. 5-D 我需要对这个表进行排

排序在这里已经讨论了很多,但我有一个特别的问题。我有一个数据框(df)和几个列。所有的观测都属于三种类型中的一种,比如C1、C2和C3。在各种列中,有一列包含一个我称之为频率(f)的值。示例df:

  Type  freq  Val 
   C3.   0.34.  10-A
   C1.   0.90.  4-A
   C2.   0.40.  5-B
   C1.   0.65.  3-C
   C2.   0.77.  5-D
   C3.   0.11.  5-D
我需要对这个表进行排序,以便主键是类型,次键是频率。然而,这是我的问题,它们需要按照特定的类型顺序进行排序。我需要C1,C3,C2。最后一张表如下所示:

   Type  freq  Val
   C1.   0.90.  4-A
   C1.   0.65.  3-C
   C3.   0.34.  10-A
   C3.   0.11.  5-D
   C2.   0.77.  5-D
   C2.   0.40.  5-B

有办法做到这一点吗?选择列类型的特定排序方案。任何建议都将不胜感激。谢谢

我们可以将“类型”转换为自定义订单中指定的
级别的
因子

library(dplyr)
df1 %>% 
   arrange(factor(Type, levels = c('C1.', 'C3.', 'C2.')), desc(freq))
#  Type  freq  Val
#1  C1. 0.90.  4-A
#2  C1. 0.65.  3-C
#3  C3. 0.34. 10-A
#4  C3. 0.11.  5-D
#5  C2. 0.77.  5-D
#6  C2. 0.40.  5-B

或使用
data.table

library(data.table)
setDT(df1)[, Type := factor(Type,  levels = c('C1.', 'C3.', 'C2.'))]
setorder(df1, Type, -freq)

base R
中,我们可以

df1[order(factor(df1$Type, levels = c('C1.', 'C3.', 'C2.')), -df1$freq),]
数据
df1我正在使用“dplyr”库。我的最终测向是正确排列频率,但类型的顺序是产生C1,C2,C3,而不是C1,C3,C2。我想知道是否缺少一些内容。@Orion11如果您需要更改列,请将
因子
输出指定给该列,然后它就可以工作了。我让它工作了。我错过了“$Type”部分。非常感谢你。
df1 <- structure(list(Type = c("C3.", "C1.", "C2.", "C1.", "C2.", "C3."
), freq = c("0.34.", "0.90.", "0.40.", "0.65.", "0.77.", "0.11."
), Val = c("10-A", "4-A", "5-B", "3-C", "5-D", "5-D")), 
  class = "data.frame", row.names = c(NA, 
-6L))