Я имею дело с выходами временного ряда регистратора данных, которые имеют общие переменные среды (например, свет, температура, скорость ветра), совместно используемые в кадре данных в различных местах.Таким образом, каждый столбец сначала называется измеряемой переменной среды (например, «a»), затем - его физическим местоположением (например, «1»), разделенным знаком «_».
В качестве примера мы можем представитькадр данных с переменными среды «a», «b» и «c», измеряемыми одновременно в трех разных местах.Это дает имя столбца для даты-времени и каждой из шести уникальных комбинаций переменных-местоположений, например, так:
"dt" "a_1" "a_2" "a_3" "b_1" "b_2" "b_3""c_1" "c_2" "c_3"
Мне нужно преобразовать фрейм данных в длинный формат, чтобы каждый столбец содержал один столбец для "dt", "a", "b" и "c"", с новым столбцом" loc "для местоположения, связанного с каждым измерением переменной среды.
Приведенный ниже код создает фиктивный кадр данных, а затем использует очень громоздкий метод для создания выходных данных, которые я хотел бы.Однако этот пример кода слишком громоздок, чтобы использовать его для больших фреймов данных (т. Е. Для десятков переменных и местоположений).
Как я могу сделать это более эффективным, используя информацию в именах столбцов для автоматического преобразования данных,желательно с тидиверс подходом через тидир и дплыр?
### Mock data:
start_time <- as.POSIXct("2000-10-01 10:10:10")
df <- data.frame(
dt= seq.POSIXt(from = start_time, length.out = 100, by = 1),
a_1=abs(rnorm(100, 1000, 500)),
b_1=abs(rnorm(100, 35, 5)),
c_1=abs(rnorm(100, 10, 2.5)),
a_2=abs(rnorm(100, 1000, 500)),
b_2=abs(rnorm(100, 35, 5)),
c_2=abs(rnorm(100, 10, 2.5)),
a_3=abs(rnorm(100, 1000, 500)),
b_3=abs(rnorm(100, 35, 5)),
c_3=abs(rnorm(100, 10, 2.5))
)
### New data frames for each location, with location identifier column:
loc1 <- df %>%
select(dt, a_1, b_1, c_1) %>%
rename(a = a_1) %>%
rename(b = b_1) %>%
rename(c = c_1) %>%
mutate(loc = as.character("1"))
loc2 <- df %>%
select(dt, a_2, b_2, c_2) %>%
rename(a = a_2) %>%
rename(b = b_2) %>%
rename(c = c_2) %>%
mutate(loc = as.character("2"))
loc3 <- df %>%
select(dt, a_3, b_3, c_3) %>%
rename(a = a_3) %>%
rename(b = b_3) %>%
rename(c = c_3) %>%
mutate(loc = as.character("3"))
### Data in desired long format:
all_data_long <- rbind(loc1, loc2, loc3)