Сортировка строк в не алфавитном порядке - PullRequest
1 голос
/ 18 июня 2019

У меня есть следующее 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 , но не смог.

Ответы [ 2 ]

1 голос
/ 18 июня 2019

Это отлично работает, если я понял логику вашей сортировки.

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
1 голос
/ 18 июня 2019

Мы можем сделать это в 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

library(tidyverse)
df %>% # initial dataset
   uncount(Code, .remove = FALSE) %>%
   mutate(rn = row_number()) %>% 
   group_by(grp = gl(n(), 3, n())) %>%
   slice(c(2, 1, 3)) %>% 
   ungroup %>% 
   select(-rn, -grp)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...