2015-03-11 2 views
1

У меня в настоящее время возникает проблема объединения большого количества данных в данные панели. Я нашел это решение, которое помогает мне для «меньших» решений: Panel Data, но я не могу применить это к «большему» формату.Создание панельных данных с большим количеством данных в R

Я попытаюсь сделать пример кодирования: Из пакета «наборов данных»:

df_1 = WorldPhones # In my case, years 2000-2014 and 43 columns (districts) 
df_2 = WorldPhones # In my case, there is different data here 
df_3 = WorldPhones # "" 
df_4 = WorldPhones # "" 

Каждый кадр данных содержит различные значения для каждого из 43 районов. Я дал каждому району уникальный идентификатор (от 1 до 43). 43 района сопоставимы с 7 регионами (континентами), указанными в наборе данных WorldPhones. Каждый информационный кадр содержит только одну переменную для каждого района и каждый год. Предположим, что df_1 содержит переменную X1, df_2 содержит X2 и т. Д. Я хочу, чтобы получить эти данные в формат «длинный», somethink так:

Id Year X1  X2 X3 ... 
1 1951 45939 21574 2876 
1 1956 60423 29990 4708 
1 1957 64721 32510 5230 
1 1958 68484 35218 6662 
1 1959 71799 37598 6856 
1 1960 76036 40341 8220 
1 1961 79831 43173 9053 
2 1951 45939 21574 2876 
2 1956 60423 29990 4708 
2 1957 64721 32510 5230 
2 1958 68484 35218 6662 
2 1959 71799 37598 6856 
2 1960 76036 40341 8220 
2 1961 79831 43173 9053 
... 
43 1951 45939 21574 2876 
43 1956 60423 29990 4708 
43 1957 64721 32510 5230 
43 1958 68484 35218 6662 
43 1959 71799 37598 6856 
43 1960 76036 40341 8220 
43 1961 79831 43173 9053 

К сожалению, я действительно не знаю, как это сделать, за исключением «грубой силы», который будет писать «его вниз "43 раза.

ответ

2

Довольно легко использовать либо tidyr, либо reshape2. IMHO, каждый пользователь R должен научиться использовать эти 2 пакета вместе с data.table, dplyr.

library("datasets") 
library(reshape2) 
library(dplyr) 
WorldPhones <- data.frame(WorldPhones) # matrix format to data.frame 
WorldPhones$Year <- rownames(WorldPhones) # create Year column 
df_1 <- df_2 <- df_3 <- WorldPhones  # 
# transform to long format using melt from reshape2 
df_1 <- melt(df_1, id.vars = "Year", variable.name = "Id", value.name="X")  
df_2 <- df_3 <- df_1      # similarly for df_2, df_3. 
# merge the datasets using left_join from dplyr 
df_1 %>% 
    left_join(df_2, by=c("Year", "Id")) %>% 
    left_join(df_3, by=c("Year", "Id")) %>% head 
    Year  Id X.x X.y  X 
1 1951 N.Amer 45939 45939 45939 
2 1956 N.Amer 60423 60423 60423 
3 1957 N.Amer 64721 64721 64721 
4 1958 N.Amer 68484 68484 68484 
5 1959 N.Amer 71799 71799 71799 
6 1960 N.Amer 76036 76036 76036 

Или с помощью data.table

library("data.table") 
dt_1 <- setDT(WorldPhones) 
dt_1 <- melt(dt_1, id.vars = "Year", variable.name = "Id", value.name="X") 
setkey(dt_1, Year, Id) 
dt_2 <- dt_3 <- dt_1 
dt_1[dt_2][dt_3]   
    Year  Id  X i.X i.X.1 
1: 1951 N.Amer 45939 45939 45939 
2: 1951 Europe 21574 21574 21574 
3: 1951  Asia 2876 2876 2876 
4: 1951 S.Amer 1815 1815 1815 
5: 1951 Oceania 1646 1646 1646 
+0

Awesome! Благодаря! Я использовал ваше первое предложение с dplyr и reshape2. :) –

+0

Вы также знаете простой трюк для копирования тех же данных (всего 1 столбец) во все регионы (районы)? В этом случае данные равны во всех регионах. –

+0

Можете ли вы уточнить? – ExperimenteR

Смежные вопросы