Как развернуть/развернуть (лить/расплавить) фрейм данных?
Как я могу "раскрыть" таблицу? Каков правильный технический термин для этого?
UPDATE: этот термин называется расплав
У меня есть кадр данных для стран и данных за каждый год
Country 2001 2002 2003
Nigeria 1 2 3
UK 2 NA 1
И я хочу иметь что-то вроде
Country Year Value
Nigeria 2001 1
Nigeria 2002 2
Nigeria 2003 3
UK 2001 2
UK 2002 NA
UK 2003 1
Ответы
Ответ 1
Я все еще не могу поверить, что я победил Андри с ответом.:)
> library(reshape)
> my.df <- read.table(text = "Country 2001 2002 2003
+ Nigeria 1 2 3
+ UK 2 NA 1", header = TRUE)
> my.result <- melt(my.df, id = c("Country"))
> my.result[order(my.result$Country),]
Country variable value
1 Nigeria X2001 1
3 Nigeria X2002 2
5 Nigeria X2003 3
2 UK X2001 2
4 UK X2002 NA
6 UK X2003 1
Ответ 2
Базовый подход R reshape
для этой проблемы довольно уродлив, особенно потому, что имена не в форме, которая нравится reshape
. Это будет примерно так: первая строка setNames
изменяет имена столбцов на то, что может использовать reshape
.
reshape(
setNames(mydf, c("Country", paste0("val.", c(2001, 2002, 2003)))),
direction = "long", idvar = "Country", varying = 2:ncol(mydf),
sep = ".", new.row.names = seq_len(prod(dim(mydf[-1]))))
Лучшей альтернативой в базе R является использование stack
, например:
cbind(mydf[1], stack(mydf[-1]))
# Country values ind
# 1 Nigeria 1 2001
# 2 UK 2 2001
# 3 Nigeria 2 2002
# 4 UK NA 2002
# 5 Nigeria 3 2003
# 6 UK 1 2003
Есть также новые инструменты для изменения данных, доступных сейчас, например, пакет "tidyr", который дает нам gather
. Конечно, метод tidyr:::gather_.data.frame
просто вызывает reshape2::melt
, поэтому эта часть моего ответа не обязательно добавляет много, кроме введения более нового синтаксиса, который вы можете встретить в Hadleyverse.
library(tidyr)
gather(mydf, year, value, `2001`:`2003`) ## Note the backticks
# Country year value
# 1 Nigeria 2001 1
# 2 UK 2001 2
# 3 Nigeria 2002 2
# 4 UK 2002 NA
# 5 Nigeria 2003 3
# 6 UK 2003 1
Все три параметра здесь потребуют переупорядочения строк, если вы хотите, чтобы порядок строк был указан в вашем вопросе.
Четвертым вариантом будет использование merged.stack
из моего пакета splitstackshape. Как и база R reshape
, вам нужно будет изменить имена столбцов на то, что включает индикатор "переменная" и "время".
library(splitstackshape)
merged.stack(
setNames(mydf, c("Country", paste0("V.", 2001:2003))),
var.stubs = "V", sep = ".")
# Country .time_1 V
# 1: Nigeria 2001 1
# 2: Nigeria 2002 2
# 3: Nigeria 2003 3
# 4: UK 2001 2
# 5: UK 2002 NA
# 6: UK 2003 1
Пример данных
mydf <- structure(list(Country = c("Nigeria", "UK"), `2001` = 1:2, `2002` = c(2L,
NA), `2003` = c(3L, 1L)), .Names = c("Country", "2001", "2002",
"2003"), row.names = 1:2, class = "data.frame")
Ответ 3
Вы можете использовать команду melt
из пакета reshape
. См. Здесь: http://www.statmethods.net/management/reshape.html
Возможно, что-то вроде melt(myframe, id=c('Country'))