2012-10-08 20 views
0

環路發現值I有一個向量v,其中c()創建的,具有這樣的數據:而不作爲R

v[a,b,d,z,e,f], it must be unordered 

我必須跟形式的txt文件:

 label  1   2   3  .... 
     b  100  2000   15 
     z  123   14   12 
     a   55   565   55 
    ..... 

我已經提取的txt文件,即分隔與卡口與strplit

 ext_data<-strsplit(file,"\t") 

我想要做的就是看是否矢量V的元素相匹配的Elemen之一它可以在那裏沒有,然後提取txt文件的第1列的相應元素,然後是第2列的元素等等

我已經使用for循環做了匹配,但是正在太多的時間,因爲txt文件中包含太多的數據,這樣的(算法)

 for i=1 to length(v) 
      for pos=2 to ext_data  #I put pos=2 because I start in the second row 
        if match(vector) and ext_data(pos,1) 
         retrieve data from column C  

什麼建議嗎?

粗略地說,我想知道是否有一種方法可以使用匹配,但是對於列,也許可以將列標籤在一行中轉換?

+0

你能發佈一個更大的數據選擇? – TARehman

+0

我不明白你爲什麼會用'strsplit'來讀取分隔文件而不是'read.delim' ...? – joran

+0

以及我使用,因爲在那之後,我可以跳進像矢量 – Layla

回答

1

只創建一些測試數據來說明我的解決方案:

testdata <- data.frame(namecol=c("b","r","a","j","z","l","s","n","t"), 
         v1=sample(1:1000,9), 
         v2=sample(1:1000,9), 
         v3=sample(1:1000,9)) 
vecfind <- c("a","b","d","z","e","f") 

使用[[]]$,可以選擇一個數據幀的第一個元素作爲載體,然後使用which%in%功能,則可以獲取數字行索引,然後提取元素,如下所示:

v1_elements <- testdata[which(testdata[[1]] %in% vecfind),2] 
v2_elements <- testdata[which(testdata[[1]] %in% vecfind),3] 
v3_elements <- testdata[which(testdata[[1]] %in% vecfind),4] 
+1

這裏你不需要'which'。另外,如果一次足夠,沒有任何理由需要三次子集,例如%vecfind中的'elements < - testdata [testdata [,1]%;元素[,2];元素[,3];元素[,4]',這應該更有效率。 – Roland

+0

@羅蘭(+1)四處都是好點。我把'which()'放在那裏,主要是爲了概念清晰,它提供了子集的工作方式。這些元素的優點 - 效率更高。 – TARehman

+0

謝謝,但我在testdata [testdata [,1] ...中得到一個錯誤,如果我只能像testdata [[1]] [[1]]那樣訪問我的元素,我該怎麼做? – Layla