2015-11-25 51 views
0

這是我第一次寫R函數。我想要做的就是,比如我有A R data.frame這樣爲什麼當我做R模式匹配時沒有輸出For循環

       Vars  match 
1        A_m   0 
2        B_m   0 
3        C   0 
4        D   34 
5        E_m  0 

這是我匹配兩段dataframes後得到的結果。在match列中,如果數字爲0,則表示Vars列中的值不匹配。例如,在第一行中,A_m在匹配列中有0。這意味着A_m沒有匹配。所以我的功能是在Vars列中找到那些不匹配的值(在匹配列中有0)。之後,如果我發現的值以「_m」結尾,那麼它就是我想要的值,並且我想將它們打印出來。

這是我寫的代碼。因爲我從來沒有寫過R函數,所以我的代碼可能會有很多問題。我想用data.frame作爲函數的參數,並使用for循環來檢查整個數據幀。在for循環中,我想用if來決定它是否是目標值。非常感謝您的幫助和耐心。

varsConvert <- function(x){ 
    for(i in 1:nrow(x)){ 
    #x[i,1]is the cordinate of the value in that dataframe, can I write like this? 
    if(x[i,1] == 0){ 
     #I want to match ends with _m by *_m 
     if(x[i,0] == "*_m"){ 
     print(x[i,0]) 
     } 
     else if(x[i,0] == "E"){ 
      print(x[i,0]) 
     } 
     else{ 
     stop("this is an error") 
     } 

    } 
    } 
} 

在我的例子我想打印的值應該是A_M,B_M和E_m

+0

模式參數是問題。與'=='一起使用時,'*'不是通配符。您需要學習使用R regex函數。 (雖然我想你可以用'substr()'用'nchar()'進行適當的計算來設置長度。 –

+0

感謝您的幫助!那麼這是我的代碼唯一的問題嗎?如果我使用正確的R正則表達式代碼可以工作嗎? – user5601679

+0

我還沒有試過測試代碼的其餘部分是否有效。我只是想回答你的標題 - 關於你爲什麼失敗的問題。我基本同意ettenne使用for-loops是一個壞主意。 –

回答

1

雖然可以寫在R「經典」 for循環,它通常最好使用其他功能這將會更短/更清潔/更快。這裏是你的數據(我把它命名爲df):

df<-structure(list(Vars = c("A_m", "B_m", "C", "D", "E_m"), match = c(0L, 
0L, 0L, 34L, 0L)), .Names = c("Vars", "match"), class = "data.frame", row.names = c(NA, 
-5L)) 

你可以這樣做:

temp<-df$Vars[df$match==0] # find the names of Vars for which match is equal to 0 
temp[grep('_m',temp)] # only select those with _m 
# [1] "A_m" "B_m" "E_m" 

的另一種選擇是選擇匹配== 0和_M在瓦爾的交叉點上的索引:

df$Vars[intersect(grep('_m',df$Vars),which(df$match==0))] 
# [1] "A_m" "B_m" "E_m" 

而另一種方法(使用布爾運算,而不是一組操作):

df$Vars[ grepl('_m',df$Vars) & df$match==0 ] 

如果你想用一個data.frame功能輸入,你可以做到這一點(我用列號這個時間來證明其他的可能性):

f<-function(data){ 
    temp<-data[,1][data[,2]==0] 
    temp[grep('_m',temp)] 
} 

要使用它,需要f(nameOfYourData)

f(df) 
# [1] "A_m" "B_m" "E_m" 
+0

我認爲設置操作的方法相當優雅,並希望布爾修正被視爲「友好」。 –

+0

@ 42-:是的,謝謝你的編輯!另外,使用布爾值比'intersect'快。 – etienne

+0

感謝您的迴應,您的意思是我只需要這兩個命令,還是需要用這些拖拽命令行替換我的for循環? – user5601679