矢量化组合R中的两个矩阵

时间:2014-07-25 18:23:09

标签: r dataframe

我有一个数据框A如下(数字完全组成)

ID statistic p.value
1   4           .1
2   5           .3
3   3           .4
4   2           .4
5   1           .5
6   7           .8

和数据框B如下:

ID  Info1 Info2 ....
4    A1    B1
5    A2    B2
2    A3    ..
3    A4
1    A5
6    A6
7    A7
9    A8
8    A9

如何在没有循环的情况下以正确的顺序将数据帧A绑定到数据帧B.我知道我需要做类似的事情:

cbind(A,B [这里的东西,])但是如何获得订购?我做哪个陈述?别的什么?

1 个答案:

答案 0 :(得分:2)

评论太长了。

因此,如果我理解正确(来自您的问题和所有评论),AB是非常大的数据框。 A有一个ID列,B在行名称中有ID个。

你绝对应该使用data.tables。假设您从某种文本文件中提取数据,请阅读data.table包中的fread(...)。这将直接将文件读入data.table。 fread(...)非常快:对于大型数据集,速度比read.table(...)read.csv(...)快10到100倍。

下面是数据框架方法与merge(...)和data.table连接方法的比较。

data.frame方法

N <- 1e7       # 10 million rows; big enough??
set.seed(1)    # for reproducible example
A <- data.frame(ID=1:N,statistic=sample(1:10,N,replace=T),pvalue=runif(N),stringsAsFactors=F)
B <- data.frame(info1=sample(LETTERS,N,replace=T),info2=sample(letters,N,replace=T),stringsAsFactors=F)
rownames(B) <- sample(1:N,N)   # row names in randon order in B

system.time({
# this does the work...
  B$ID   <- as.integer(rownames(B))
  result <- merge(B,A,by="ID")
})
#    user  system elapsed 
#  285.75    3.15  289.33 

data.table方法

set.seed(1)
A <- data.frame(ID=1:N,statistic=sample(1:10,N,replace=T),pvalue=runif(N),stringsAsFactors=F)
B <- data.frame(info1=sample(LETTERS,N,replace=T),info2=sample(letters,N,replace=T),stringsAsFactors=F)
rownames(B) <- sample(1:N,N)

library(data.table)
system.time({
# this does the work...
  IDs <- as.integer(rownames(B))
  setDT(A)
  setDT(B)
  B[,ID:=IDs]
  setkey(A,ID)
  setkey(B,ID)
  B[A,c("statistic","pvalue"):=list(statistic,pvalue=pvalue)]  
})
#    user  system elapsed 
#  122.46    0.40  122.87 

因此,在此示例中,data.table方法的速度是其两倍。但是大部分时间都花在将rownames转换为列上,所以如果你可以将它们读入一列开始,特别是如果你可以使用fread(...)将数据直接读入data.tables,那么这将是更快。