0

我有一个大致如下的数据框:

X   Cat     Nam    Val
1   Total  Total   102012
2   Car     A       12312
3   Car     B       22222
4   Car     Total   34534
5   Bike    C       1000
6   Bike    Total   1000

我希望它看起来像:

X   Cat     Nam    Val
1   Car    Total   34534
2   Car     A       12312
3   Car     B       22222
4   Bike   Total   1000
5   Bike    C       1000
6   Total  Total   102012

有没有更简单的方法来重新排列,这取决于可能有​​更多的类别?

4

2 回答 2

0

您可以根据您想要数据的顺序分配因子水平。

例如,在Cat列中,您希望'Total'值排在最后,因此将其保留在最后levels,其余的保留在开头。在Nam列中你想Total成为第一所以保持第一。安排因子水平后,您可以order在这 2 列中获取数据。

使用基础 R,您可以这样做:

df <- transform(df, 
            Cat = factor(Cat, levels = unique(c(Cat[Cat != 'Total'], 'Total'))), 
            Nam = factor(Nam, levels = unique(c('Total', Nam))))

df[with(df, order(Cat, Nam)), ]

#  X   Cat   Nam    Val
#4 4   Car Total  34534
#2 2   Car     A  12312
#3 3   Car     B  22222
#6 6  Bike Total   1000
#5 5  Bike     C   1000
#1 1 Total Total 102012
于 2020-10-07T10:18:56.933 回答
0

我们可以使用逻辑向量arrange

library(dplyr)
df1 %>% 
    arrange(Cat == 'Total', Cat, Nam != 'Total')

如果 'Cat' 值需要以相同的顺序排列

df1 %>%
  arrange(Cat == 'Total', 
         factor(Cat, levels = c(setdiff(unique(Cat), 'Total'), 'Total')),
         Nam != 'Total') %>%
   mutate(X = row_number()) -> out

-输出

out
#  X   Cat   Nam    Val
#1 1   Car Total  34534
#2 2   Car     A  12312
#3 3   Car     B  22222
#4 4  Bike Total   1000
#5 5  Bike     C   1000
#6 6 Total Total 102012

数据

df1 <- structure(list(X = 1:6, Cat = c("Total", "Car", "Car", "Car", 
"Bike", "Bike"), Nam = c("Total", "A", "B", "Total", "C", "Total"
), Val = c(102012L, 12312L, 22222L, 34534L, 1000L, 1000L)), 
class = "data.frame", row.names = c(NA, 
-6L))
于 2020-10-07T00:14:16.293 回答