2016-11-18 121 views
0

我試圖在數據框中創建一個唯一列,其中兩個字符串的左邊兩個字符串之間的字符數字匹配。按行部分字符串匹配

每一行代表有一個比較字符串,我們希望用它作爲針對給定字符串的用戶的測試。給定一個數據幀:

df <- data.frame(x=c("yhf", "rnmqjk", "wok"), y=c("yh", "rnmj", "ok")) 

     x y 
1 yhf yh 
2 rnmqjk rnmj 
3 wok ok 

其中x是我們比較字符串,y是我們給定的字符串,我期待在列的z「2,3,0」的輸出值,就像這樣:

 x y z 
1 yhf yh 2 
2 rnmqjk rnmj 3 
3 wok ok 0 

本質上,我期待從左 - >右對比較字符串(x)檢查給定的字符串(y),並且當字符不排列時不檢查其餘部分字符串並記錄匹配號碼。

預先感謝您!

回答

0

此代碼對你的例子:

df$z <- mapply(function(x, y) which.max(x != y), 
       strsplit(as.character(df$x), split=""), 
       strsplit(as.character(df$y), split="")) - 1 

df 
     x y z 
1 yhf yh 2 
2 rnmqjk rnmj 3 
3 wok ok 0 

作爲概要,strsplit將字符串分割成矢量字符向量的列表。這裏,矢量的每個元素都是單個字符(split =「」參數)。 which.max函數返回其參數爲矢量最大值的第一個位置。由於x != y返回的向量是邏輯的,因此which.max返回觀察到差異的第一個位置。 mapply接受一個函數並列出並將提供的函數應用於列表的相應元素。

請注意,這會產生警告,指出字符串的長度不匹配。這可以通過幾種方式解決,如果郵件錯誤,最簡單的方法是將功能封裝在suppressWarnings中。


由於OP音符詮釋的意見,如果有其中整個單詞匹配,則which.max返回1.返回相同的長度字符串的情況下,我想補充一點,結合邏輯的第二碼線子集與nchar函數:

df$z[as.character(df$x) == as.character(df$y)] <- 
         nchar(as.character(df$x[as.character(df$x) == as.character(df$y)])) 
+0

嗨lmo,感謝幫助我與此。我注意到,當字符串完全匹配時,您創建的函數返回一個「0」(因爲沒有x!= y的實例)。你有沒有關於如何修改你的代碼的建議,以便當x = y時它會返回比較字符串的字符串長度? –