Как преобразовать данные из широкоформатного формата в длинный, используя аналогичные имена столбцов в R? - PullRequest
0 голосов
/ 24 августа 2018

Недавно я удалил данные с веб-сайта, и они напоминают таблицу данных в переменной input ниже.

input <- data.frame(
     "Date" = sprintf("%02d-Jan", 1:15),
     "Type_event_1" =  c(rep("Skiing", 3), rep("Marathon", 7), rep("Skating", 5)),
     "sport_event_1"= c(rep("Alpine skiing",4), rep("Biathlon",6), rep("Curling",3), rep("Figure skating",2)),
     "Type_event_2" =  c(rep("Skiing", 4), rep("Marathon", 6),rep("Ice-Hockey", 3), rep("Skating", 2)),
     "sport_event_2"= c(rep("Skeleton",4), rep("Luge",6), rep("Hockey",3), rep("Ski Jumping",2))
     )

Я хочу rbind столбцов с общим суффиксом ("event_1", "event_2") один под другим вместе со столбцом "Date". В этом случае у меня просто 4 столбца, то есть 2 события, что если бы у меня было 40 столбцов, т.е. 20 таких событий. Как я могу сделать это с помощью цикла for?
Ожидаемый результат выглядит следующим образом:

expected_output <- data.frame(
  "Date" = rep(sprintf("%02d-Jan", 1:15),2),
  "Type_event_1" =  c(rep("Skiing", 3), rep("Marathon", 7), rep("Skating", 5),rep("Skiing", 4), rep("Marathon", 6),rep("Ice-Hockey", 3), rep("Skating", 2)),
  "sport_event_1"= c(rep("Alpine skiing",4), rep("Biathlon",6), rep("Curling",3), rep("Figure skating",2),rep("Skeleton",4), rep("Luge",6), rep("Hockey",3), rep("Ski Jumping",2))
)

Ответы [ 2 ]

0 голосов
/ 24 августа 2018

Попробуйте

library(data.table)
library(dplyr)
out1=data.table::melt(input[c(1,grep("Type_event_",names(input)))],"Date")[,c(1,3)]
out2=data.table::melt(input[c(1,grep("sport_event_",names(input)))],"Date")[,c(1,3)]
final<-cbind(out1,out2[,-1])
names(final)<-c("Date","Type_event","sport_event")
0 голосов
/ 24 августа 2018
library(tidyverse)

tbl_df(input) %>%
  unite(v1, Type_event_1, sport_event_1) %>%
  unite(v2, Type_event_2, sport_event_2) %>%
  gather(v1,v2, -Date) %>%
  separate(v2, c("Type_event","sport_event"), sep = "_") %>%
  select(-v1)

# # A tibble: 30 x 3
#     Date   Type_event sport_event  
#    <fct>  <chr>      <chr>        
# 1 01-Jan Skiing     Alpine skiing
# 2 02-Jan Skiing     Alpine skiing
# 3 03-Jan Skiing     Alpine skiing
# 4 04-Jan Marathon   Alpine skiing
# 5 05-Jan Marathon   Biathlon     
# 6 06-Jan Marathon   Biathlon     
# 7 07-Jan Marathon   Biathlon     
# 8 08-Jan Marathon   Biathlon     
# 9 09-Jan Marathon   Biathlon     
#10 10-Jan Marathon   Biathlon     
# # ... with 20 more rows

Примечание: я использую tbl_df(input) только для целей визуализации.Вы можете использовать только input %>% ....

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...