将两个数据框的列粘贴在一起。

7
我发现有时候需要将不同的数据框(表格、矩阵或其他)的列拼接在一起。例如,我有一个均值表和一个标准差表。我想要将这两个表格粘贴在一起,并将标准差放在括号中以便于LaTeX打印。我猜测plyr包可能会提供友好的解决方案,但我不知道如何处理两个数据框(我尝试将数据框存储为列表,然后使用ldply函数,但这是我第一次尝试使用plyr包中的列表函数,结果失败了。
谢谢您提前的帮助。
#=========
#fake data
#=========
x<-mtcars[1:3,1:3]
y<-mtcars[1:3,8:10]


#==========================
#A column pasting function
#==========================
meansd<-function(x, y){
x<-round(x, dig=2)
y<-round(y, dig=2)
paste(x, "(", y, ")", sep="")
}

我只做到了这一步。

期望结果 不需要列名。返回值是矩阵或数据框都可以。

16.46(0)  0(1)  1(4)
17.02(0)  0(1)  1(4)
18.61(1)  1(1)  1(4)

2
如果您想在Latex中生成回归摘要表格,则可以查看memisc包中的mtable。它是一个非常灵活的函数,可以让您轻松地以多种格式输出回归结果。 - Ramnath
@Ramnath 谢谢您的评论。我最近才熟悉这个软件包。它可以完成我想要的大部分LaTeX输出,但仍有一些灵活性需要做一些mtable无法实现的事情。 - Tyler Rinker
你打算将生成的数据框转换成 xtable 吗? - Ari B. Friedman
你能更清楚地说明一下你所期望的输出格式吗?mtable非常灵活,我很惊讶它不能做一些标准的事情 :) - Ramnath
@gsk 是的,我会使用xtable与解决方案(#3解决方案[你的]是我最喜欢的;基础包和简单),但我会对其进行一些调整,并使其成为一个函数,该函数接受平均值和标准差表并生成可发布的平均值表。感谢您的解决方案。 - Tyler Rinker
3个回答

10
mapply怎么样?
x <- mtcars[1:3,1:3]
y <- mtcars[1:3,8:10]

mypaste <- function(x,y) paste(x, "(", y, ")", sep="")

mapply(mypaste, x,y)

     mpg       cyl    disp    
[1,] "21(0)"   "6(1)" "160(4)"
[2,] "21(0)"   "6(1)" "160(4)"
[3,] "22.8(1)" "4(1)" "108(4)"

1
谢谢!我也喜欢你的ldply解决方案。相似的风格,只是加了一点Hadley的精华。 - Ari B. Friedman
我最喜欢的解决方案。谢谢你。简单而美丽。非常有创意的思维。 - Tyler Rinker

7

这里介绍一种使用plyr的方法。

t(ldply(1:NCOL(x), function(i) meansd(x[,i], y[,i])))

4

以下是您的函数,已编辑为循环遍历并粘贴每个列。这将给出所需的结果,但可能有更巧妙的方法来实现。

meansd<-function(x, y){
    x<-round(x, digits = 2)
    y<-round(y, digits = 2)
    out <- matrix(ncol = dim(x)[1], nrow = dim(x)[2])
    for(i in 1:dim(x)[1])
    {
        out[i, ] <-paste(x[i, ], "(", y[i, ], ")", sep="")
    }
    return(out)
}

Ryan,感谢您的回复。非常有效。如果可能的话,我希望得到一个非循环的答案(我相信这是可能的,只是不知道如何实现)。 - Tyler Rinker
这是第一个符合我的规格的答案,所以我将其标记为被接受的答案。虽然我希望我能够同时选中三个答案。 - Tyler Rinker

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接