Как изменить порядок столбцов в кадре данных по последнему значению в каждом столбце в R - PullRequest
4 голосов
/ 12 февраля 2020

это мой первый вопрос, рад быть здесь :) Итак, у меня есть датафрейм, например:

date <- as.Date(c('2019-03-1','2019-4-25','2019-5-25','2019-6-14','2019-7-14','2019-8-15'))
US <- c(340, 450, 100, 400, 500, 350)
JP <- c(600, 700, 400, 600, 500, 700)
CHN <- c(400, 550, 450, 600, 200, 300)
GER <- c(800, 900, 700, 700, 600, 900)
IT <- c(400, 500, 350, 600, 600, 500)
BR <- c(300, 400, 450, 300, 450, 250)

df <- data.frame(date, US, JP, CHN, GER, IT, BR)

, который дает

      startdate  US  JP CHN GR  IT  BR
1   2019-03-01  340 600 400 800 400 300
2   2019-04-25  450 700 550 900 500 400
3   2019-05-25  100 400 450 700 350 450
4   2019-06-14  400 600 600 700 600 300
5   2019-07-14  500 500 200 600 600 450
6   2019-08-15  350 700 300 900 500 250

то, что я хочу, это изменить порядок столбцов в этом кадре данных так, чтобы во втором столбце была страна с наибольшим значением на последнюю дату (в данном случае «2019-08-15»), а страна со вторым наибольшим значением на последнюю дату была бы третий столбец и тд. Это примерно последнее значение, а не более ранние даты. Прямо как здесь:


      startdate  GR  JP  IT US  CHN  BR
1   2019-03-01  800 600 400 340 400 300
2   2019-04-25  900 700 500 450 550 400
3   2019-05-25  700 400 350 100 450 450
4   2019-06-14  700 600 600 400 600 300
5   2019-07-14  600 500 600 500 200 450
6   2019-08-15  900 700 500 350 300 250

Пытаюсь разобраться в этом уже два дня и ничего не получится. Пожалуйста, помогите:)

Ответы [ 2 ]

6 голосов
/ 12 февраля 2020

Базовая опция R будет заключаться в получении последней строки кадра данных и order их на основе значений в них. При оформлении заказа мы игнорируем столбец date.

df[c(1, order(-df[nrow(df), -1]) + 1)]

#        date GER  JP  IT  US CHN  BR
#1 2019-03-01 800 600 400 340 400 300
#2 2019-04-25 900 700 500 450 550 400
#3 2019-05-25 700 400 350 100 450 450
#4 2019-06-14 700 600 600 400 600 300
#5 2019-07-14 600 500 600 500 200 450
#6 2019-08-15 900 700 500 350 300 250
3 голосов
/ 12 февраля 2020

Немного более многословный подход, чем у Ронака, с использованием имен столбцов:

last_vals = unlist(df[nrow(df), -1])
df = df[, c("date", names(sort(last_vals, decreasing = TRUE)))]
df
#         date GER  JP  IT  US CHN  BR
# 1 2019-03-01 800 600 400 340 400 300
# 2 2019-04-25 900 700 500 450 550 400
# 3 2019-05-25 700 400 350 100 450 450
# 4 2019-06-14 700 600 600 400 600 300
# 5 2019-07-14 600 500 600 500 200 450
# 6 2019-08-15 900 700 500 350 300 250
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...