2013-09-29 36 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