Изменение формы данных.кадр из широкого в длинный формат
у меня есть некоторые проблемы, чтобы преобразовать мои data.frame
от широкого стола к длинному столу.
На данный момент это выглядит так:
Code Country 1950 1951 1952 1953 1954
AFG Afghanistan 20,249 21,352 22,532 23,557 24,555
ALB Albania 8,097 8,986 10,058 11,123 12,246
теперь мне нравится трансформировать это data.frame
на долго data.frame
.
Что-то вроде этого:
Code Country Year Value
AFG Afghanistan 1950 20,249
AFG Afghanistan 1951 21,352
AFG Afghanistan 1952 22,532
AFG Afghanistan 1953 23,557
AFG Afghanistan 1954 24,555
ALB Albania 1950 8,097
ALB Albania 1951 8,986
ALB Albania 1952 10,058
ALB Albania 1953 11,123
ALB Albania 1954 12,246
Я посмотрел и попробовал его уже с melt()
и reshape()
функции
как некоторые люди предлагали подобные вопросы.
Однако до сих пор я получаю только грязные результаты.
если это возможно, я хотел бы сделать это с reshape()
функция с тех пор
это выглядит немного приятнее в обращении.
5 ответов:
reshape()
требуется время, чтобы привыкнуть к, так какmelt
/cast
. Вот решение с reshape, предполагая, что ваш фрейм данных называетсяd
:reshape(d, direction = "long", varying = list(names(d)[3:7]), v.names = "Value", idvar = c("Code","Country"), timevar = "Year", times = 1950:1954)
три альтернативных решения:
1: с
reshape2
library(reshape2) long <- melt(wide, id.vars = c("Code", "Country"))
даем:
Code Country variable value 1 AFG Afghanistan 1950 20,249 2 ALB Albania 1950 8,097 3 AFG Afghanistan 1951 21,352 4 ALB Albania 1951 8,986 5 AFG Afghanistan 1952 22,532 6 ALB Albania 1952 10,058 7 AFG Afghanistan 1953 23,557 8 ALB Albania 1953 11,123 9 AFG Afghanistan 1954 24,555 10 ALB Albania 1954 12,246
альтернативных обозначений, которые дают тот же результат:
# you can also define the id-variables by column number melt(wide, id.vars = 1:2) # as an alternative you can also specify the measure-variables # all other variables will then be used as id-variables melt(wide, measure.vars = 3:7) melt(wide, measure.vars = as.character(1950:1954))
2: с
data.table
вы можете использовать то же самое
С помощью изменить:
#data x <- read.table(textConnection( "Code Country 1950 1951 1952 1953 1954 AFG Afghanistan 20,249 21,352 22,532 23,557 24,555 ALB Albania 8,097 8,986 10,058 11,123 12,246"), header=TRUE) library(reshape) x2 <- melt(x, id = c("Code", "Country"), variable_name = "Year") x2[,"Year"] <- as.numeric(gsub("X", "" , x2[,"Year"]))
так как этот ответ помечен Р-чаво, я чувствовал, что было бы полезно поделиться другой альтернативой из базы R:
stack
.обратите внимание, однако, что
stack
не работает сfactor
s--это работает только еслиis.vector
иTRUE
, и из документации дляis.vector
, мы находим, что:
is.vector
возвращаетTRUE
если x-вектор указанного режима, не имеющий атрибутов кроме имена. Он возвращаетFALSE
иначе.я использую образец данных из ответа @Jaap, где значения в Столбцах год
factor
s.здесь
stack
подход:cbind(wide[1:2], stack(lapply(wide[-c(1, 2)], as.character))) ## Code Country values ind ## 1 AFG Afghanistan 20,249 1950 ## 2 ALB Albania 8,097 1950 ## 3 AFG Afghanistan 21,352 1951 ## 4 ALB Albania 8,986 1951 ## 5 AFG Afghanistan 22,532 1952 ## 6 ALB Albania 10,058 1952 ## 7 AFG Afghanistan 23,557 1953 ## 8 ALB Albania 11,123 1953 ## 9 AFG Afghanistan 24,555 1954 ## 10 ALB Albania 12,246 1954
вот еще один пример, показывающий использование
gather
Сtidyr
. Вы можете выбрать столбцы дляgather
либо путем удаления их по отдельности (как я делаю здесь), либо путем включения лет, которые вы хотите явно.обратите внимание, что для обработки запятых (и X добавляется, если
check.names = FALSE
не установлен), я также используюdplyr
мутирует сparse_number
Сreadr
для преобразования текстовых значений в числовой формат. Это все частьtidyverse
и так можно нагрузить вместе сlibrary(tidyverse)
wide %>% gather(Year, Value, -Code, -Country) %>% mutate(Year = parse_number(Year) , Value = parse_number(Value))
возвращает:
Code Country Year Value 1 AFG Afghanistan 1950 20249 2 ALB Albania 1950 8097 3 AFG Afghanistan 1951 21352 4 ALB Albania 1951 8986 5 AFG Afghanistan 1952 22532 6 ALB Albania 1952 10058 7 AFG Afghanistan 1953 23557 8 ALB Albania 1953 11123 9 AFG Afghanistan 1954 24555 10 ALB Albania 1954 12246