Performance 避免R中data.frame的行处理
我想知道在R中避免行处理的最好方法是什么,大多数行处理都是在内部C例程中完成的。例如:我有一个数据框Performance 避免R中data.frame的行处理,performance,r,dataframe,Performance,R,Dataframe,我想知道在R中避免行处理的最好方法是什么,大多数行处理都是在内部C例程中完成的。例如:我有一个数据框a: chromosome_name start_position end_position strand 1 15 35574797 35575181 1 2 15 35590448 35591641 -1 3 15 35688422 3
a
:
chromosome_name start_position end_position strand
1 15 35574797 35575181 1
2 15 35590448 35591641 -1
3 15 35688422 35688645 1
4 13 75402690 75404217 1
5 15 35692892 35693969 1
我想要的是:根据链是正的还是负的,
startOFgene
作为start\u位置
或end\u位置
。避免for
循环的一种方法是使用+1链和-1链分离data.frame并执行选择。还有什么方法可以加快速度?如果每行有某些其他复杂的处理,则该方法不会放大 也许这足够快了
transform(a, startOFgene = ifelse(strand == 1, start_position, end_position))
chromosome_name start_position end_position strand startOFgene
1 15 35574797 35575181 1 35574797
2 15 35590448 35591641 -1 35591641
3 15 35688422 35688645 1 35688422
4 13 75402690 75404217 1 75402690
5 15 35692892 35693969 1 35692892
首先,由于所有列都是整数/数字,因此可以使用矩阵而不是data.frame。矩阵上的许多操作要比data.frame上的相同操作快得多,尽管在这种情况下它们并没有太大区别。然后可以使用逻辑子集来创建
startOFgene
列
# Create some large-ish data
M <- do.call(rbind,replicate(1e3,as.matrix(a),simplify=FALSE))
M <- do.call(rbind,replicate(1e3,M,simplify=FALSE))
A <- as.data.frame(M)
# Create startOFgene column in a matrix
m <- function() {
M <- cbind(M, startOFgene=M[,"start_position"])
negStrand <- sign(M[,"strand"]) < 0
M[negStrand,"startOFgene"] <- M[negStrand,"end_position"]
}
# Create startOFgene column in a data.frame
d <- function() {
A$startOFgene <- A$start_position
negStrand <- sign(A$strand) < 0
A$startOFgene[negStrand] <- A$end_position[negStrand]
}
library(rbenchmark)
benchmark(m(), d(), replications=10)[,1:6]
# test replications elapsed relative user.self sys.self
# 2 d() 10 18.804 1.000 16.501 2.224
# 1 m() 10 19.713 1.048 16.457 3.152
#创建一些大型ish数据
M您是否考虑过先对数据帧进行排序(检查?排序
或?排序
)-它可能会加快您的搜索速度(如加快排序/排序矩阵的计算速度)