Изменение формы данных.кадр из широкого в длинный формат
у меня есть некоторые проблемы, чтобы преобразовать мои 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: с
reshape2library(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не работает сfactors--это работает только еслиis.vectorиTRUE, и из документации дляis.vector, мы находим, что:
is.vectorвозвращаетTRUEесли x-вектор указанного режима, не имеющий атрибутов кроме имена. Он возвращаетFALSEиначе.я использую образец данных из ответа @Jaap, где значения в Столбцах год
factors.здесь
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