我有一个数据框架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。我知道我需要这样做:
(A,这里有些东西)但是我怎么得到订单呢?我要做什么陈述?还有别的吗?
发布于 2014-07-26 02:00:31
时间太长了,不能发表评论。
因此,如果我正确地理解您(从您的问题和所有评论中),A
和B
是非常大的数据帧。A
有一个ID列,B
在行名中有ID
。
为此,您绝对应该使用data.tables。假设您正在从某种文本文件中提取数据,请阅读fread(...)
包中的data.table。这将直接将文件读取到data.table中。fread(...)
非常快:对于大型数据集,其速度是read.table(...)
或read.csv(...)
的10-100倍。
下面是数据帧方法与merge(...)
和data.table连接方法的比较。
data.frame approach
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 approach
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方法的速度是原来的两倍。但是大部分时间用于将行名转换为列,所以如果您可以首先将它们读入列,特别是如果您可以使用data.tables直接将数据读入fread(...)
,这将更快。
https://stackoverflow.com/questions/24962173
复制相似问题