我有以下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)))
重复两次Gas
,Lunch
和Car
之后,看起来像这样:
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
排序,1
,2
(每个Tax
和Gas
,Tax
和Lunch
,Tax
和Car
一组):
有没有图书馆的方法吗?因为最终的脚本将不仅用于我,而且还用于工作中的新手。
我已经尝试过:
df[order(factor(df$Code, levels = c(2,1,2))),]
并将row.names
作为列添加到match
中,如下所示:df[order(df$Code, df$row.names),]
,但似乎无法正常工作。
还尝试了this和this的答案,但没有成功。
答案 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