Сбор нескольких столбцов данных в настоящее время в виде фактора - PullRequest
0 голосов
/ 29 мая 2019

У меня есть набор вагонов поездов. В настоящее время в нем указывается номер (еженедельная загрузка) для каждой компании (строка) для каждой недели (столбцы) в течение пары лет (более 100 столбцов). Я хочу собрать это в две колонки: дата и загрузка.

В настоящее время это выглядит так:

3/29/2017  4/5/2017  4/12/2017  4/19/2017
32.7       31.6      32.3       32.5
20.5       21.8      22.0       22.3
24.1       24.1      23.6       23.4
24.9       24.7      24.8       26.5

Я ищу:

Date        Load
3/29/2017   32.7
3/29/2017   20.5
3/29/2017   24.1
3/29/2017   24.9
4/5/2017    31.6

Я делал различные версии следующего:

rail3 <- rail2 %>% 
  gather(`3/29/2017`:`1/24/2018`, key = "date", value = "loads")

Когда я делаю это, он создает набор данных с именем rail3, но не создает новые столбцы, которые я хотел. Это только сделало набор данных в 44 раза длиннее, чем было. И это дало мне следующее сообщение:

Warning message:
attributes are not identical across measure variables;
they will be dropped 

Я предполагаю, что это потому, что столбцы даты в настоящее время закодированы как факторы. Но я также не уверен, как преобразовать более 100 столбцов из числовых факторов. Я пробовал следующие и различные другие методы:

rail2["3/29/2017":"1/24/2018"] <- lapply(rail2["3/29/2017":"1/24/2018"], as.numeric)

Ничего из этого не сработало. Дайте мне знать, если у вас есть какие-либо советы. Спасибо!

Ответы [ 2 ]

0 голосов
/ 29 мая 2019

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

library(tidyr)
library(hablar)

# Data from above but with factors
rail2<-read.table(header=TRUE, text="3/29/2017  4/5/2017  4/12/2017  4/19/2017
32.7       31.6      32.3       32.5
                  20.5       21.8      22.0       22.3
                  24.1       24.1      23.6       23.4
                  24.9       24.7      24.8       26.5", check.names=FALSE) %>% 
  as_tibble() %>% 
  convert(fct(everything()))

# Code
rail2 %>% 
  convert(num(everything())) %>% 
  gather("date", "load") %>% 
  convert(dte(date, .args = list(format = "%m/%d/%Y")))

Дает:

# A tibble: 16 x 2
   date        load
   <date>     <dbl>
 1 2017-03-29  32.7
 2 2017-03-29  20.5
 3 2017-03-29  24.1
 4 2017-03-29  24.9
 5 2017-04-05  31.6
0 голосов
/ 29 мая 2019

Вот возможное решение:

rail2<-read.table(header=TRUE, text="3/29/2017  4/5/2017  4/12/2017  4/19/2017
32.7       31.6      32.3       32.5
20.5       21.8      22.0       22.3
24.1       24.1      23.6       23.4
24.9       24.7      24.8       26.5", check.names=FALSE)

library(tidyr)
# gather the data from columns and convert to long format.
rail3 <- rail2 %>% gather(key="date", value="load")

rail3
#        date load
#1  3/29/2017 32.7
#2  3/29/2017 20.5
#3  3/29/2017 24.1
#4  3/29/2017 24.9
#5   4/5/2017 31.6
#6   4/5/2017 21.8
#7 ...  
...