R распространение данных при сохранении порядка - PullRequest
1 голос
/ 25 июня 2019

У меня есть набор данных, который выглядит следующим образом -

dataset = data.frame(Site=c(rep('A',3),rep('B',3),rep('C',3)),MonthYear = c(rep(c('May 19','Apr 19','Mar 19'),3)),Date=c(rep(c('2019-05-31','2019-04-30','2019-03-31'),3)),Measure=c(rep(c('Service','Speed','Efficiency'),3)),Score=runif(9,0,1))

Моя цель - преобразовать этот набор данных с помощью функции spread.Однако после этого я бы хотел, чтобы столбцы спреда были упорядочены по столбцу Date (в порядке возрастания).

Это означало бы, что столбцы спреда расположены в следующем порядке: Mar 19,Apr 19, May 19

Вот моя попытка -

library(dplyr)
library(tidyr)

final = dataset %>% spread(MonthYear,Score) 

Моя попытка приводит к тому, что столбцы разброса расположены в алфавитном порядке.И не в хронологическом порядке.

Заранее благодарим за ваш вклад

Ответы [ 3 ]

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

Единственная проблема заключается в том, что dataset$MonthYear является фактором и не упорядочен так, как вам нравится.

#Find Order by Date column
dLvl <- unique(dataset$MonthYear[order(dataset$Date)])
levels(dataset$MonthYear)
#[1] "Apr 19" "Mar 19" "May 19"
dataset$MonthYear <- factor(dataset$MonthYear, levels = dLvl)
levels(dataset$MonthYear)
#[1] "Mar 19" "Apr 19" "May 19"
final = dataset %>% spread(MonthYear,Score) 
final
# Site       Date    Measure    Mar 19    Apr 19    May 19
#1    A 2019-03-31 Efficiency 0.9928678        NA        NA
#2    A 2019-04-30      Speed        NA 0.1457551        NA
#3    A 2019-05-31    Service        NA        NA 0.6047312
#4    B 2019-03-31 Efficiency 0.4419907        NA        NA
#5    B 2019-04-30      Speed        NA 0.5799068        NA
1 голос
/ 25 июня 2019

Если вы преобразуете их в даты, вы можете упорядочить столбцы в соответствии с порядком этих дат

df <- 
  dataset %>% 
    spread(MonthYear,Score)

col_dts <- as.Date(paste0('01', names(df)), format = '%d%b %y')
df <- df[order(!is.na(col_dts), col_dts)]

df    
#   Site       Date    Measure     Mar 19    Apr 19    May 19
# 1    A 2019-03-31 Efficiency 0.76653679        NA        NA
# 2    A 2019-04-30      Speed         NA 0.0416291        NA
# 3    A 2019-05-31    Service         NA        NA 0.3885358
# 4    B 2019-03-31 Efficiency 0.02538343        NA        NA
# 5    B 2019-04-30      Speed         NA 0.7264234        NA
# 6    B 2019-05-31    Service         NA        NA 0.5128166
# 7    C 2019-03-31 Efficiency 0.50107038        NA        NA
# 8    C 2019-04-30      Speed         NA 0.9013112        NA
# 9    C 2019-05-31    Service         NA        NA 0.3678922

Или вы можете изменить уровни фактора в соответствии с порядком значений дат

new_levels <- 
  with(dataset, {
        mons <- unique(MonthYear)
        ord <- order(as.Date(paste0('01', mons), format = '%d%b %y'))
        mons[ord]})

dataset$MonthYear <- factor(dataset$MonthYear, levels = new_levels)

dataset %>% 
  spread(MonthYear,Score)

#   Site       Date    Measure     Mar 19    Apr 19    May 19
# 1    A 2019-03-31 Efficiency 0.76653679        NA        NA
# 2    A 2019-04-30      Speed         NA 0.0416291        NA
# 3    A 2019-05-31    Service         NA        NA 0.3885358
# 4    B 2019-03-31 Efficiency 0.02538343        NA        NA
# 5    B 2019-04-30      Speed         NA 0.7264234        NA
# 6    B 2019-05-31    Service         NA        NA 0.5128166
# 7    C 2019-03-31 Efficiency 0.50107038        NA        NA
# 8    C 2019-04-30      Speed         NA 0.9013112        NA
# 9    C 2019-05-31    Service         NA        NA 0.3678922

Вы также можете использовать reorder с dcast (не уверен, почему он не работает со спредом)

library(data.table)

dataset %>% 
  dcast(Site + Date + Measure ~ reorder(MonthYear, -order(Date)), 
        value.var = 'Score')

#   Site       Date    Measure     Mar 19    Apr 19    May 19
# 1    A 2019-03-31 Efficiency 0.76653679        NA        NA
# 2    A 2019-04-30      Speed         NA 0.0416291        NA
# 3    A 2019-05-31    Service         NA        NA 0.3885358
# 4    B 2019-03-31 Efficiency 0.02538343        NA        NA
# 5    B 2019-04-30      Speed         NA 0.7264234        NA
# 6    B 2019-05-31    Service         NA        NA 0.5128166
# 7    C 2019-03-31 Efficiency 0.50107038        NA        NA
# 8    C 2019-04-30      Speed         NA 0.9013112        NA
# 9    C 2019-05-31    Service         NA        NA 0.3678922
1 голос
/ 25 июня 2019

Заказать соответствующие уровни факторов и все готово.

library(tidyr)

dataset = data.frame(Site=c(rep('A',3),rep('B',3),rep('C',3)),MonthYear = c(rep(c('May 19','Apr 19','Mar 19'),3)),Date=c(rep(c('2019-05-31','2019-04-30','2019-03-31'),3)),Measure=c(rep(c('Service','Speed','Efficiency'),3)),Score=runif(9,0,1))
dataset$MonthYear <- factor(dataset$MonthYear, levels = c("Mar 19", "Apr 19", "May 19"))

spread(dataset, key = MonthYear, value = Score)

  Site       Date    Measure     Mar 19    Apr 19     May 19
1    A 2019-03-31 Efficiency 0.09789678        NA         NA
2    A 2019-04-30      Speed         NA 0.4645101         NA
3    A 2019-05-31    Service         NA        NA 0.89602042
4    B 2019-03-31 Efficiency 0.59516115        NA         NA
5    B 2019-04-30      Speed         NA 0.5208239         NA
6    B 2019-05-31    Service         NA        NA 0.45334636
7    C 2019-03-31 Efficiency 0.93941294        NA         NA
8    C 2019-04-30      Speed         NA 0.5439323         NA
9    C 2019-05-31    Service         NA        NA 0.07971263
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...