2015-06-09 2 views
0

У меня есть некоторая информация о народонаселении из нескольких когорт в списке. Каждая когорта покрывает перекрывающийся период времени. Данные выглядит следующим образом:Преобразование списка перекрывающихся данных. Кадров в один файл data.frame

> raw.data 
$`1` 
    Year  Pop 
1 1920 1927433 
2 1921 1914551 
3 1922 1900776 

$`2` 
    Year  Pop 
1 1921 1915576 
2 1922 1902075 
3 1923 1887613 

$`3` 
    Year  Pop 
1 1922 1902111 
2 1923 1887862 
3 1924 1872695 

Я хотел бы, чтобы преобразовать его в один кадр данных, где имена столбцов годы и диагонали демографические данные. Вывод должен выглядеть следующим образом:

> resulting.data 
    1920 1921 1922 1923 1924 
1 1927433 1915576 1902111  NA  NA 
2  NA 1914551 1902075 1887862  NA 
3  NA  NA 1900776 1887613 1872695 

Вы можете найти примеры данных для ввода и желаемый результат ниже:

raw.data <- structure(list(`1` = structure(list(Year = 1920:1922, Pop = c(1927433L, 1914551L, 1900776L)), .Names = c("Year", "Pop"), row.names = c(NA, 3L), class = "data.frame"), `2` = structure(list(Year = 1921:1923, Pop = c(1915576L, 1902075L, 1887613L)), .Names = c("Year", "Pop"), row.names = c(NA, 3L), class = "data.frame"), `3` = structure(list(Year = 1922:1924, Pop = c(1902111L, 1887862L, 1872695L)), .Names = c("Year", "Pop"), row.names = c(NA, 3L), class = "data.frame")), .Names = c("1", "2", "3")) 
resulting.data <- structure(list(X1920 = c(1927433, NA, NA), X1921 = c(1915576, 1914551, NA), X1922 = c(1902111, 1902075, 1900776), X1923 = c(NA, 1887862, 1887613), X1924 = c(NA, NA, 1872695)), .Names = c("X1920", "X1921", "X1922", "X1923", "X1924"), row.names = c(NA, -3L), class = "data.frame") 

Я посмотрел на this link, который предлагает подобный вопрос, но я был неудачен в адаптируя его к моим потребностям. Я также попытался использовать plyr, чтобы сначала попытаться получить диагонали, а затем объединить их, но тогда я не уверен, как это сделать.

ответ

1

Использования do.call() с rbind() для преобразования данных в один кадр данных, затем reshape2::dcast() для перепрофилирования:

dat <- do.call(rbind, raw.data) 
dat$obs <- gsub(".*?\\.", "", row.names(dat)) 

library(reshape2) 
dcast(dat, obs ~ Year, fun.aggregate = sum, value.var = "Pop") 

    obs 1920 1921 1922 1923 1924 
1 1 1927433 1915576 1902111  0  0 
2 2  0 1914551 1902075 1887862  0 
3 3  0  0 1900776 1887613 1872695 
+0

Обратите внимание, что полученные данные от моего выхода на самом деле имеют те векторы населения, как диагонали, а не как Horizonal векторы , – ruser45381

+0

Я не понимаю, что вы подразумеваете под этим. – Andrie

+0

Ваш выход не соответствует моему. – ruser45381

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