我有一个数据框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 [这里的东西,])但是如何获得订购?我做哪个陈述?别的什么?
答案 0 :(得分:2)
评论太长了。
因此,如果我理解正确(来自您的问题和所有评论),A
和B
是非常大的数据框。 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,那么这将是更快。