将行按非字母定制顺序排序

时间:2019-06-18 14:37:05

标签: r sorting dataframe

我有以下df,其中:Name显示要支付的概念,并且Code必须重复Name的次数才能优化流程。最初看起来像这样:

Name    Code
Tax      1
Gas      2
Tax      1
Gas      2
Tax      1
Lunch    2
Tax      1
Car      2

df = data.frame(Name = c('Tax', 'Gas', 'Tax', 'Gas', 'Tax', 'Lunch', 'Tax', 'Car'), Code = rep(c(1,2)))

重复两次GasLunchCar之后,看起来像这样:

Name    Code
Tax      1
Gas      2
Gas      2
Tax      1
Gas      2
Gas      2
Tax      1
Lunch    2
Lunch    2
Tax      1
Car      2
Car      2

df = df[rep(seq_len(nrow(df)), df$Code),]

我想做的是对行进行重新排序,使我的df看起来像这样,其中df只是以Code的方式按2排序,12(每个TaxGasTaxLunchTaxCar一组):

有没有图书馆的方法吗?因为最终的脚本将不仅用于我,而且还用于工作中的新手。

我已经尝试过: df[order(factor(df$Code, levels = c(2,1,2))),] 并将row.names作为列添加到match中,如下所示:df[order(df$Code, df$row.names),],但似乎无法正常工作。 还尝试了thisthis的答案,但没有成功。

2 个答案:

答案 0 :(得分:1)

我们可以在TTF_HINTING_LIGHT_SUBPIXEL

中完成此操作
base R

或与i1 <- with(df, ave(seq_len(nrow(df)), as.integer(gl(nrow(df), 3, nrow(df))), FUN = function(i) c(i[c(2, 1, 3)]))) out <- df[i1,] row.names(out) <- NULL out # Name Code #1 Gas 2 #2 Tax 1 #3 Gas 2 #4 Gas 2 #5 Tax 1 #6 Gas 2 #7 Lunch 2 #8 Tax 1 #9 Lunch 2 #10 Car 2 #11 Tax 1 #12 Car 2

tidyverse

答案 1 :(得分:1)

假设我了解您进行排序的逻辑,这将非常有效。

df = data.frame(Name = c('Tax', 'Gas', 'Tax', 'Gas', 'Tax', 'Lunch', 'Tax', 'Car'),
                Code = rep(c(1,2)))
df = df[rep(seq_len(nrow(df)), df$Code),]
vect<-c()
for (i in 1:nrow(df)){
  if ((i+1)%%3==0)
      vect<-c(vect,i,i-1,i+1)
}
df<-df[vect,] 
rownames(df)<-NULL