2013-09-29 104 views
1

我有一个要追加的向量,这里是代码,由于nrow很大,所以代码很慢。在两个向量中的compatea值并将比较结果分配给R中的一个新向量

我只想加快速度。我试过c()和append(),两者似乎不够快。 我checkd Efficiently adding or removing elements to a vector or list in R?

下面是代码:

compare<-vector() 

for (i in 1:nrow(domin)){ 

    for (j in 1:nrow(domin)){ 
     a=0 
    if ((domin[i,]$GPA>domin[j,]$GPA) & (domin[i,]$SAT>domin[j,]$SAT)){ 
     a=1 
    } 
    compare<-c(compare,a) 
    } 
    print(i) 
} 

我发现这是很难搞清楚的,如果我用

#compare<-rep(0,times=nrow(opt_predict)*nrow(opt_predict)) 
+0

你应该用'outer'生成一个矩阵,我想。 – Frank

+0

我觉得可以有一个更好的标题,因为这是关于比较效率(我认为),而不是追加? – Frank

回答

6

你想将这些信息比较索引更好地放置在矩阵中:

v1 <- 1:3 
v2 <- c(1,2,2) 
mat1 <- outer(v1,v1,`>`) 
mat2 <- outer(v2,v2,`>`) 
both <- mat1 & mat2 

要查看哪些位置t他不等式成立的,使用which

which(both,arr.ind=TRUE) 
#  row col 
# [1,] 2 1 
# [2,] 3 1 

评论:

  • 这个答案应该比你的循环要快得多。然而,你真的只是排序两个向量,所以有可能是一个更快的方法来做到这一点,而不是采取一套详尽的不平等...
  • 在你的情况,只有一个部分排序(因为, ij,这两个维度中的任何一个都不可能严格大于另一个维度)。如果用先上v1,然后排序上v2不满意,您可以使用data.table包很容易得到一个完整的排序:

    set.seed(1) 
    v1 <- sample.int(10,replace=TRUE) 
    v2 <- sample.int(10,replace=TRUE) 
    
    require(data.table) 
    DT <- data.table(v1,v2) 
    setkey(DT) 
    DT[,rank:=.GRP,by='v1,v2'] 
    

    这给

    v1 v2 rank 
    1: 1 8 1 
    2: 3 3 2 
    3: 3 8 3 
    4: 4 2 4 
    5: 6 7 5 
    6: 7 4 6 
    7: 7 10 7 
    8: 9 5 8 
    9: 10 4 9 
    10: 10 8 10 
    

    这取决于你打算接下来做。

+0

澄清,v1和v2是您的GPA和SAT向量。 – Frank