使用R中带引号的列表中的名称自动合并多个对象

时间:2013-06-18 08:06:39

标签: r merge

我有一些名称为a1,b1,c1的对象,并希望使用带有名称的列表将它们全部合并到df中,而不是手动将其写下来而不用引号。问题是我不知道如何删除引号以合并它们。这是我的代码:

a1=rnorm(10)
b1=rnorm(10)
c1=rnorm(10)

mylist=c("a1","b1","c1")
mylist2=gsub('"',"",mylist)
myarray=merge(mylist2)

1 个答案:

答案 0 :(得分:2)

这些不是data.frame,因此您无法像在示例中那样合并它们。也许你的意思是cbind这些?

您可以使用do.call并在列表中使用实际的data.frame并以cbind方式使用它们......

mylist = list(a1,b1,c1)
do.call("cbind",mylist)
#            [,1]       [,2]        [,3]
# [1,]  0.4221196 -1.2364700  1.71030549
# [2,]  0.2190202 -0.7730380 -0.27255412
# [3,] -0.1123769 -0.3365485  0.99418659
# [4,]  0.2940520 -1.2661584 -0.28545402
# [5,]  0.6301444 -1.3027926 -1.15401858
# [6,]  0.3505416  0.1636393  0.18114359
# [7,] -1.4592066  1.5832108  0.01407487
# [8,] -1.4251704 -1.1620232 -0.86712358
# [9,] -0.2840417 -2.3878617  0.57925139
#[10,] -0.9331564  1.1445266 -1.64355007

当然,在这里,你可以cbind( a1, b1 , c1 ),所以如果你的矢量在列表中,这个符号只是方便。

如果你想merge他们,问题是merge合并两个data.frames,所以你需要一个递归函数,在你移动时为结果添加一个新的data.frame列表。幸运的是,这样的函数存在(它实际上很简单),并且在Haldey的reshape包中...

a1 <- data.frame( ID = 1:10 , A = rnorm(10) )
b1 <- data.frame( ID = 1:10 , B = rnorm(10) )
c1 <- data.frame( ID = 1:10 , C = rnorm(10) )
mylist <- list( a1 , b1 , c1 )


require(reshape)
merge_recurse( mylist )
#   ID          A           B           C
#1   1  0.4922820  1.44436959  0.49294607
#2   2  1.0198506  0.80738257 -1.51090757
#3   3  0.2403974  0.47383044 -0.74280235
#4   4  0.9697800 -1.06054666 -1.11042732
#5   5  1.4001970 -0.30221304  1.62866212
#6   6  0.4705122  0.02784419 -0.05886697
#7   7 -0.4259260  0.29810051  0.77933144
#8   8 -0.5102871  0.36181297  1.51223053
#9   9  1.1900207 -0.60902034 -0.32316668
#10 10 -0.1694786  0.20842787 -0.33366816