2015-07-03 43 views
3

我有一個數據集(稱爲eyeData),在很短的版本是這樣的:循環在許多試驗中刪除重複[R

sNumber runningTrialNo wordTar        
1  1    vital  
1  1    raccoon        
1  1    vital        
1  1    accumulates        
1  2    tornado        
1  2    destroys         
1  2    tornado        
1  2    destroys         
1  2    property         
4  51    denounces        
4  51    brings        
4  51    illegible        
4  51    frequently        
4  51    brings       
4  61    cerebrum 
4  61    vital 
4  61    knowledge 
4  61    vital 
4  61    cerebrum 

我寫了一個循環來刪除所有副本(同對於每個單獨的審判wordTar列的話),這樣的數據是這樣的:

sNumber runningTrialNo wordTar        
1   1    vital  
1   1    raccoon       
1   1    accumulates        
1   2    tornado        
1   2    destroys         
1   2    property         
4   51    denounces        
4   51    brings        
4   51    illegible        
4   51    frequently     
4   61    cerebrum 
4   61    vital 
4   61    knowledge 
4   61    cerebrum       

下面的代碼:

for (sno in eyeData$sNumber) { 
for(trial in eyeData$runningTrialNo) { 
ss <- subset(eyeData, sNumber == sno & runningTrialNo == trial) 
ss.s <- ss[!duplicated(ss$wordTar), ] 
} 
} 

但是,它運行了很長時間,所以我把它關閉了......因爲我是R環境新手,我的猜測是我在循環中做錯了。有沒有辦法改善我的循環,所以它會給我一個理想的輸出?

回答

1

For循環通常在R中很慢。您通常需要vectorize your code。有一噸的方式做到這一點,這裏是使用庫dplyr一個例子:通過使用microbenchmark,在這裏我們運行代碼100次,看看如何

library(dplyr) 
eyeData %>% group_by(runningTrialNo) %>% 
      distinct(wordTar) 

這是非常非常快,我們可以看到它需要的時間長:

library(microbenchmark) 

microbenchmark(dplyr = eyeData %>% group_by(runningTrialNo) %>% 
        distinct(wordTar), 
       old = for (sno in eyeData$sNumber) { 
         for(trial in eyeData$runningTrialNo) { 
          ss <- subset(eyeData, sNumber == sno & runningTrialNo == trial) 
          ss.s <- ss[!duplicated(ss$wordTar), ] 
         } 
        }) 

Unit: milliseconds 
    expr  min   lq  mean  median   uq  max neval 
dplyr 1.256438 1.287158 1.567518 1.495092 1.550579 12.29212 100 
    old 102.203029 110.265423 112.664063 111.789698 113.166710 304.58312 100 
+0

102分鐘的循環......的確很多。 %>%在你的代碼中引用了什麼?粘貼我的代碼? – MariKo

+0

這是毫秒,所以102也不算太壞,只要你的數據不是太大。 '%>%'是'dplyr'使用的'magrittr'中的鏈運算符。它的工作方式是將前一個輸出作爲第一個參數傳遞給下一個函數 - 嘗試閱讀[dplyr vignette](http://cran.rstudio.com/web/packages/dplyr/vignettes/introduction.html))以獲取更多詳細信息 – jeremycg