【问题标题】:faster way to run a loop in r在 r 中运行循环的更快方法
【发布时间】:2016-02-08 14:25:44
【问题描述】:

我有三个数据框 A、B 和 C。

A 有 18000 行和 18000 列,B 有 150000 行和 5 列。

我想用 B 填充 A 的元素。

循环需要很长时间。我怎样才能更快地运行这个循环?

A的例子

Entrez_Gene_Id 2324 34345 4345 1234 3453
1 Entrez_Gene_Id    0     0    0    0    0
2          23040    0     0    0    0    0
3           7249    0     0    0    0    0
4          64478    0     0    0    0    0
5           4928    0     0    0    0    0
6          58191    0     0    0    0    0

B 的例子

  head(B)
  V1 Gene1 Gene2      weight   newWeight
1  1  4171  4172  2.01676494 0.020420929
2  2  2237  5111 1.933298567 0.015300857
3  4   506   509 2.439170425 0.020577243
4  7  6635  6636 2.255316779 0.081088975
5  8  6133  6210 3.427969232 0.021132906
6 10 23521  6217 1.607247743 0.027792961   

这是我的代码:

B<- data.frame(lapply(C, as.character), stringsAsFactors=FALSE)

for(i in 1:nrow(B)){
  Rname=B[i,2]
  Cname=B[i,3]
  A[Rname,Cname]=B[i,5]
  print(i)
}

【问题讨论】:

  • 你能显示AB中的内容吗
  • 不要使用循环。 R 中的许多操作都是矢量化的。
  • 试试A[cbind(B[,2],B[,3])] &lt;- B[,5]
  • B 是字符,A 是整数。
  • 这是一个很好的问题示例。用户不仅提供了数据外观的示例。他们也有他们想要的输出。请编辑您的问题。 stackoverflow.com/questions/4862178/…

标签: r loops


【解决方案1】:

您似乎正在尝试用稀疏表示法的矩阵填充完整矩阵。您可以使用 Matrix 包中的 dgCMatrix 类来执行此操作:

library(Matrix)
b_mat <- sparseMatrix(i=B[,2],j=B[,3],x=B[,5])

这会使矩阵保持稀疏格式。转换为 18,000 x 18,000 格式:

as.data.frame(as.matrix(b_mat))

编辑:我建议将 as.data.frame 呼叫留在这里,因为考虑到您拥有的列数,matrix 会更容易使用

【讨论】:

  • 有趣的包。你能和base R方法做一个时间比较吗?
  • @PierreLafortune 在处理稀疏矩阵时,它并没有比 Matrix 包更高效。
  • @PierreLafortune Matrix 是一个“推荐”包,预计将在每个 R 安装中提供。
  • @knifer B$gene1 &lt;- factor(B$gene1); B$gene2 &lt;- factor(B$gene2); sparseMatrix(i=as.integer(B$gene1),j=as.integer(B$gene1),x=B[,5], dimnames = list(levels(B$gene1), levels(B$gene2)))
猜你喜欢
  • 1970-01-01
  • 2013-01-12
  • 1970-01-01
  • 2021-07-07
  • 1970-01-01
  • 1970-01-01
  • 2014-06-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多