2013-04-05 2 views
2

У меня есть три набора данных поперечного сечения, и я пытаюсь объединить их в один продольный набор данных. Некоторые меры постоянны (id, пол, сообщество), а другие меняются со временем (x1 и y). Я хотел бы иметь длинный окончательный набор данных с одним столбцом для каждой из перечисленных выше переменных. Я думал, что merge_recurse() будет делать трюк, но он производит по два столбца для y и x1 (хотя данные12 и data14 сливаются, как я надеялся ... возможно, потому что эти переменные переименованы после первого слияния?). Любые мысли о том, как сделать это просто и быстро? Примеры данных ниже.Слияние данных для создания продольных данных

#Constant over time 
id = seq(1, 100, 1) 
sex = sample(c("male","female"), 100, replace=TRUE) 
community = sample(c("comA", "comB", "comC", "comD"), 100, replace=TRUE) 
#2010 
year = rep(2010, 100) 
x1 = rnorm(100, mean=5, sd=1) 
y = rnorm(100, mean=10, sd=2) 
z = rep(5, 100) 
data10 = data.frame(cbind(id, year, sex, community, y, x1, z)) 
#2012 
year = rep(2012, 100) 
x1 = rnorm(100, mean=6, sd=1) 
y = rnorm(100, mean=11, sd=2) 
data12 = data.frame(cbind(id, year, sex, community, y, x1)) 
#2014 
year = rep(2014, 100) 
x1 = rnorm(100, mean=7, sd=1) 
y = rnorm(100, mean=12, sd=2) 
data14 = data.frame(cbind(id, year, sex, community, y, x1)) 
#Merge each year's data 
library(reshape) 
#Create a list of all datasets 
alldata=list(data10, data12, data14) 
#Merge data from multiple dataframes 
data = merge_recurse(alldata, by=c("id", "year", "sex", "community") 

head(data) 

id year sex community    y.x    x1.x z y.y x1.y 
1 1 2010 female  comC 13.1771632561173 4.87556993759158 5 <NA> <NA> 
2 2 2010 female  comB 13.7778630888456 6.69677435551805 5 <NA> <NA> 
3 3 2010 male  comD 9.42440506678606 3.10067578314296 5 <NA> <NA> 
4 4 2010 female  comB 11.0739409098036 4.12318001019941 5 <NA> <NA> 
5 5 2010 male  comB 11.6015489242693 4.9565493450503 5 <NA> <NA> 
6 6 2010 female  comB 6.52739602897104 3.76896148237067 5 <NA> <NA> 
+0

Я думаю, что вы просто ищете 'do.call (rbind, ALLDATA)' ?? – Arun

+0

Будет хорошо, если вы можете опубликовать образец вывода, т.е. head (data) – Nishanth

+0

Извините, данные моего примера несколько вводят в заблуждение. Мои фактические наборы данных поперечного сечения содержат переменные, которые не измеряются в каждый период времени, и, следовательно, do.call (rbind, alldata) не работает. Он отлично работает, если все столбцы одинаковы. Выведенный выше код был добавлен выше. – DBK

ответ

1

Я думаю, что вы ищете это:

all <- do.call(rbind, alldata) 
final <- reshape(all, v.names=c("y", "x1"), idvar=c("id", "sex", "community"), 
       timevar="year", direction="wide") 

head(final, 3) 
# id sex community y.2010 x1.2010 y.2012 x1.2012 y.2014 x1.2014 
# 1 1 female  comA 7.711 5.510 13.952 6.502 11.480 6.629 
# 2 2 male  comB 9.130 5.672 11.470 5.500 10.295 7.338 
# 3 3 male  comC 15.322 4.889 10.185 5.774 12.257 5.941 
+0

Я хочу его в длинной, а не широкой форме. Как я уже упоминал выше в комментариях, функция do.call будет работать, если все столбцы идентичны. В моем фактическом наборе данных это не так. То есть некоторые переменные не существуют в некоторых наборах данных для слияния. В приведенных данных примера не существует симметрии. – DBK

+0

@DBK, вы пробовали 'rbind.fill'? – flodel

+0

Спасибо. Это работает. – DBK