【发布时间】:2013-04-05 15:32:23
【问题描述】:
我有三个横截面数据集,我正在尝试将它们合并为一个纵向数据集。一些度量是恒定的(id、sex、community),而另一些则随时间变化(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>
【问题讨论】:
-
我想你只是在寻找
do.call(rbind, alldata)?? -
如果你能发布样本输出就好了。头部(数据)
-
对不起,我的示例数据有些误导。我的实际横截面数据集包含未在每个时间段内测量的变量,因此 do.call(rbind, alldata) 不起作用。如果所有列都相同,它会完美运行。上述代码的输出已在上面附加。
-
也许来自 plyr 的
ldply是你想要的? -
修复您的示例,如果它不能反映您的要求。这就是编辑按钮的用途。