首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >R中两个矩阵的向量化

R中两个矩阵的向量化
EN

Stack Overflow用户
提问于 2014-07-25 18:23:09
回答 1查看 112关注 0票数 0

我有一个数据框架A如下(数字是完全合成的)

代码语言:javascript
运行
复制
ID statistic p.value
1   4           .1
2   5           .3
3   3           .4
4   2           .4
5   1           .5
6   7           .8

和数据帧B如下:

代码语言:javascript
运行
复制
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,这里有些东西)但是我怎么得到订单呢?我要做什么陈述?还有别的吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-07-26 02:00:31

时间太长了,不能发表评论。

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

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

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

data.frame approach

代码语言:javascript
运行
复制
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

代码语言:javascript
运行
复制
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(...),这将更快。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24962173

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档