2013-04-05 6 views
2

세 개의 횡단면 데이터 세트가 있으며 하나의 종단 데이터 세트로 병합하려고합니다. 일부 측정 값은 일정하며 (ID, 성별, 커뮤니티) 시간이 지남에 따라 달라집니다 (x1 및 y). 위에서 언급 한 각각의 변수에 대해 하나의 열을 가진 긴 형식의 최종 데이터 세트를 갖고 싶습니다. 나는 merge_recurse()가 트릭을 할 것이라고 생각했지만 y와 x1에 대해 각각 두 개의 열을 생성했다. (비록 data12와 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

관련 문제