R Поворот нескольких столбцов из широких в длинные

#r #pivot-table

#r #сводная таблица

Вопрос:

Я не уверен, как использовать pivot дольше, когда мне нужно повернуть несколько столбцов (но не все столбцы) из широких в длинные.

Начальные данные:

     dat <- tibble(aColumn = c("stuff", "stuff", "stuff"),
               anotherColumn = c("more stuff", "more stuff", "more stuff"),
               `Day a Time` = c("12:00", "13:00", "14:00"),
               `Day a Value` = c("R", "I", "O"),
               `Day b Time` = c("12:45", "14:00", "15:35"),
               `Day b Value` = c("R", "P", "O"))
  

FinalData:

 desiredDat <- tibble(aColumn = rep("stuff", 6),
       anotherColumn = rep("more stuff", 6),
       DayID = c("a", "a", "a", "b", "b", "b"),
       DayTime = c("12:00", "13:00", "14:00", "12:45", "14:00", "15:35"),
       DayValue = c("R","I","O","R","P","O"))

  

Кто-нибудь знает, как я могу это сделать?

Ответ №1:

Вот вариант с pivot_longer подстрокой после перестановки имен столбцов. Мы rename меняем столбцы, начинающиеся с ‘Day’, переставляя слова, т.Е. подстроки ‘a’, ‘b’ в имени столбца сдвигаются в конец с помощью разделителя _ , захватывая эти слова ( (\w ) ), а затем заменяя на str_replace , изменяя порядок обратных ссылок ( \1 и т. \2 Д.)

 library(dplyr)
library(stringr)
library(tidyr)
dat %>%
     rename_at(vars(starts_with('Day')), 
       ~ str_replace(., '(\w ) (\w ) (\w )', "\1\3_\2")) %>% 
     pivot_longer(cols = starts_with('Day'), 
           names_to = c( ".value", "DayID"), names_sep="_")
  

-вывод

 # A tibble: 6 x 5
#  aColumn anotherColumn DayID DayTime DayValue
#  <chr>   <chr>         <chr> <chr>   <chr>   
#1 stuff   more stuff    a     12:00   R       
#2 stuff   more stuff    b     12:45   R       
#3 stuff   more stuff    a     13:00   I       
#4 stuff   more stuff    b     14:00   P       
#5 stuff   more stuff    a     14:00   O       
#6 stuff   more stuff    b     15:35   O    
  

Комментарии:

1. Это работает. Можете ли вы немного уточнить регулярное выражение? Спасибо

Ответ №2:

В базе R вы могли бы сделать:

 dat1 <- setNames(dat, sub(" (\w ) (\w )$",'\2 \1', names(dat)))

tms <- unique(sub('\w  (\w) \w ', '\1', names(df)[-(1:2)]))

reshape(dat1, -(1:2), dir='long', times = tms, sep=' ')

    aColumn anotherColumn time DayTime DayValue id
1.a   stuff    more stuff    a   12:00        R  1
2.a   stuff    more stuff    a   13:00        I  2
3.a   stuff    more stuff    a   14:00        O  3
1.b   stuff    more stuff    b   12:45        R  1
2.b   stuff    more stuff    b   14:00        P  2
3.b   stuff    more stuff    b   15:35        O  3
  

Затем вы можете изменить имена столбцов на то, что вы хотите