2013-10-01 2 views
0

У меня есть data.frame, первоначально полученный из txt-файла. Это происходит в довольно неудобной форме, когда наблюдения назначаются по столбцам по годам. Фактические переменные, которые мне нужны в качестве регрессоров в моем анализе, присваиваются одному столбцу как факторы. Так что мне нужно сделать следующее преобразование для этого data.frame:Форматирование R data.frame - переключение столбцов наблюдения в переменные и наоборот?

  VAR YEAR.1 YEAR.2 YEAR.3 
FIRM.1 VAR.1 FV_11.1 FV_11.2 FV_11.3 
FIRM.1 VAR.2 FV_12.1 FV_12.2 FV_12.3 
FIRM.2 VAR.1 FV_21.1 FV_21.2 FV_21.3 
FIRM.2 VAR.2 FV_22.1 FV_22.2 FV_22.3 

где FV_ij.k является наблюдение для фирмы я переменная J в год к. Полученный data.frame бы идеально выглядеть так:

  YEAR VAR.1 VAR.2 
FIRM.1 YEAR.1 FV_11.1 FV_12.1 
FIRM.1 YEAR.2 FV_11.2 FV_12.2 
FIRM.1 YEAR.3 FV_11.3 FV_12.3 
FIRM.2 YEAR.1 FV_21.1 FV_22.1 
FIRM.2 YEAR.2 FV_21.2 FV_22.2 
FIRM.2 YEAR.3 FV_21.3 FV_22.3  

У меня есть идея, как закодировать это, но это громоздко. Интересно, есть ли какой-нибудь пакет, который бы удобно преобразовал вид?

ответ

2

Я предлагаю melt и dcast из пакета «reshape2». Но, во-первых, вот некоторые примеры данных:

mydf <- structure(list(FIRM = c("FIRM.1", "FIRM.1", "FIRM.2", "FIRM.2"), 
    VAR = c("VAR.1", "VAR.2", "VAR.1", "VAR.2"), YEAR.1 = c("FV_11.1", 
    "FV_12.1", "FV_21.1", "FV_22.1"), YEAR.2 = c("FV_11.2", "FV_12.2", 
    "FV_21.2", "FV_22.2"), YEAR.3 = c("FV_11.3", "FV_12.3", "FV_21.3", 
    "FV_22.3")), .Names = c("FIRM", "VAR", "YEAR.1", "YEAR.2", "YEAR.3"), 
    class = "data.frame", row.names = c(NA, -4L)) 
mydf 
#  FIRM VAR YEAR.1 YEAR.2 YEAR.3 
# 1 FIRM.1 VAR.1 FV_11.1 FV_11.2 FV_11.3 
# 2 FIRM.1 VAR.2 FV_12.1 FV_12.2 FV_12.3 
# 3 FIRM.2 VAR.1 FV_21.1 FV_21.2 FV_21.3 
# 4 FIRM.2 VAR.2 FV_22.1 FV_22.2 FV_22.3 

Шаг 1: Получите ваши данные в длинном формате. Прежде чем это сделать, разделите «VAR». из колонки «УАК»

library(reshape2) 
mydf$VAR <- gsub("VAR.", "", mydf$VAR) 
out <- melt(mydf, id.vars=c("FIRM", "VAR")) 

Шаг 2: Используйте dcast, чтобы получить данные в форму вы хотите

dcast(out, FIRM + variable ~ VAR) 
#  FIRM variable  1  2 
# 1 FIRM.1 YEAR.1 FV_11.1 FV_12.1 
# 2 FIRM.1 YEAR.2 FV_11.2 FV_12.2 
# 3 FIRM.1 YEAR.3 FV_11.3 FV_12.3 
# 4 FIRM.2 YEAR.1 FV_21.1 FV_22.1 
# 5 FIRM.2 YEAR.2 FV_21.2 FV_22.2 
# 6 FIRM.2 YEAR.3 FV_21.3 FV_22.3 
Смежные вопросы