#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
Затем вы можете изменить имена столбцов на то, что вы хотите