#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 Вероятно, в имени есть небольшие изменения, кроме цифр в конце