Как изменить форму фрейма данных и транспонировать повторяющиеся столбцы в строки фрейма данных?

#r #aggregate #reshape #transpose

#r #агрегировать #изменить форму #транспонировать

Вопрос:

У меня есть фрейм данных с повторяющимися столбцами (интервал равен 5).

мой фрейм данных на данный момент

Итак, вот как это выглядит: У меня есть столбцы 5 типов, и они повторяются с течением времени. Повторяющиеся столбцы имеют суффикс в своем имени, его также можно удалить / переименовать, чтобы все они совпадали.

Что я хотел бы сделать, так это перенести эти повторяющиеся столбцы в строки, чтобы в итоге у меня было только 5 столбцов (даты, PX_LAST, PX_HIGH, PX_VOLUME, Name). Тогда я мог бы группировать фрейм данных по датам, имени и т. Д. И делать много других вещей.

Я попробовал некоторые манипуляции с помощью pipe operator %>%, но на данный момент это не сработало. Поскольку у меня не осталось никаких идей, я подумал, что, возможно, вы могли бы мне помочь.

Заранее спасибо!

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

1. Можете ли вы показать небольшой воспроизводимый пример с dput ожидаемым результатом

2. dft <- data.frame(«Дата» = 1:2, «Возраст» = c(21,15), «Дата» = 1:2, «Возраст» = c(32,12)) …. dft2 <- data.frame(«Дата» = c(1,2,1,2), «Возраст» = c(21,15,32,12))

3. Это два разных набора данных или один?

4. Можете ли вы попробовать решение, опубликованное ниже (при условии, что это один набор данных

5. Как и первая, это текущая ситуация, которая у меня есть на данный момент. И другой — каким я в идеале хочу, чтобы мой фрейм данных был. Эти два просто случайные примеры того, как я хотел бы, чтобы это выглядело.

Ответ №1:

Одним из вариантов было бы split поместить данные в list data.frame на основе имен столбцов, а затем rbind их вместе

 nm1 <-  sub("\.\d ", "", names(dft))
i1 <- ave(seq_along(dft), nm1, FUN = seq_along)
out <- do.call(rbind, lapply(split.default(dft, i1), 
      function(x) setNames(x, sub("\.\d ", "", names(x)))))
row.names(out) <- NULL
out
#  Date Age
#1    1  21
#2    2  15
#3    1  32
#4    2  12
 

Или другой вариант — перебирать unique имена, подмножество данных unlist , и преобразовать в data.frame

 un1 <- unique(nm1)
setNames(data.frame(lapply(un1, 
       function(x) unlist(dft[grep(x, names(dft))]))), un1)
 

данные

 dft <- data.frame("Date" = 1:2, "Age" = c(21,15), "Date" = 1:2, "Age" = c(32,12))
 

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

1. Большое спасибо!!! Они оба работают. Сначала этого не произошло, но у меня возникла какая-то проблема с моим собственным фреймом данных, но когда я выбрал только несколько столбцов, это сработало. Спасибо, чувак!!

2. @Martiiin Вероятно, в имени есть небольшие изменения, кроме цифр в конце