2014-01-07 80 views
0

我有兩行和每列包含一個字符,這大致是這樣的20列data.frame(列蜷縮在這裏爲清楚起見):匹配中的R模式

 Cols 1-20 
    row1 ghuytuthjilujshdftgu 
    row2 ghuytuthjilujshdftgu 

我想機制,用於從位置10開始逐個字符(逐列)比較這兩個字符串並向外掃描,返回匹配字符的數量,直到遇到第一個差異。在這種情況下,顯然兩行都是相同的,所以答案是20.重要的是,即使它們完全相同,就像上面的情況一樣,不應該有錯誤消息(它應該被返回) 。

利用該替代示例中,答案應爲12:

Cols 1-20 
row1 ghuytuthjilujshdftgu 
row2 XXXXXXXXjilujshdftgu 

下面是一些代碼,以產生數據幀:

r1 <- "ghuytuthjilujshdftgu" 
r2 <- "ghuytuthjilujshdftgu" 
df1 <- as.data.frame(rbind(unlist(strsplit(r1, "")), unlist(strsplit(r1, "")))) 

r1 <- "ghuytuthjilujshdftgu" 
r2 <- "XXXXXXXXjilujshdftgu" 
df1 <- as.data.frame(rbind(unlist(strsplit(r1, "")), unlist(strsplit(r1, "")))) 

編輯。

該對象的類別的是data.frame並且它是subsettable-昏暗= 2,20(各列/字符是在其自己的訪問)

+4

請提供一個可重現的例子。這是一個矩陣嗎?這是一列數據框嗎? –

+0

嘿..它是一個data.frame(我更新了anser)..這有幫助嗎? – user3069326

+0

我刪除我的答案,因爲它不清楚你在問什麼。 – agstudy

回答

0

下面是拆分DF成兩片的答案(從中心向左和向右,重新排序左邊,以便從中心到第一個值),然後使用cumsum和NA計算長度,以便cumsum一旦出現不匹配就變爲NA,然後找到最高索引值不是NA來表示從中心開始的最長拉伸而沒有不匹配。

sim_len <- function(df, center=floor(ncol(df)/2)) { 
    dfs <- list(df[, max(center, 1):1, drop=F], df[, center:ncol(df), drop=F]) 
    df.count <- lapply(dfs, function(df) { 
    diff <- cumsum(ifelse(df[1, ] == df[2, ], 1, NA_integer_)) 
    diff[max(which(!is.na(diff)))] 
    }) 
    max(0L, sum(unlist(df.count)) - 1L) 
} 

這裏是運行它(as.data.frame企業只是從創建的字符串數據幀的一些例子。請注意,「中心」列中的最後一行計算兩次,因此-1L該功能。

r1 <- "ghuytuthjilujshdftgu" 
r2 <- "ghuytuthjilujshdftgu" 
df1 <- as.data.frame(rbind(unlist(strsplit(r1, "")), unlist(strsplit(r1, "")))) 
sim_len(df1) 
# [1] 20 

r1 <- "ghuytut3jilujshdftgu" 
r2 <- "ghuytuthjilujshdftgu" 
df2 <- as.data.frame(rbind(unlist(strsplit(r1, "")), unlist(strsplit(r2, "")))) 
sim_len(df2) 
# [1] 12 

r1 <- "ghuytut3jilujshdftgu" 
r2 <- "ghuytuthjilujxhdftgu" 
df3 <- as.data.frame(rbind(unlist(strsplit(r1, "")), unlist(strsplit(r2, "")))) 
sim_len(df3) 
# [1] 5 

r1 <- "ghuytut3xilujshdftgu" 
r2 <- "ghuytuthjixujxhdftgu" 
df4 <- as.data.frame(rbind(unlist(strsplit(r1, "")), unlist(strsplit(r2, "")))) 
sim_len(df4) 
# [1] 1 

,報告左,右計數的變化。請注意,「中心」進行計數左,右,這樣的總和左+右比什麼報道1大原創功能:

sim_len2 <- function(df, center=floor(ncol(df)/2)) { 
    dfs <- list(left=df[, max(center, 1):1, drop=F], right=df[, center:ncol(df), drop=F]) 
    vapply(dfs, 
    function(df) { 
     diff <- cumsum(ifelse(df[1, ] == df[2, ], 1, NA_integer_)) 
     diff[max(which(!is.na(diff)))] 
     }, 
     numeric(1L) 
) } 
sim_len2(df1) 
# left right 
# 10 11 
sim_len2(df4, 4) 
# left right 
# 4  4 
+0

@BroadieG工作......但你能否以某種方式實現它不會自動在字符串中心自動啓動,而是在給定的位置? – user3069326

+0

@BroadieG我可以用任何隨機位置重新定位中心嗎?是否有機會展示不僅最終結果,而且還有展示左側和右側匹配的數量? – user3069326

+0

@ user3069326,我修改了代碼以添加可選的'center'參數。請注意,這並不會檢查您的「中心」是否合理(即在'df'的#列中)。如果這適用於您,請將q標記爲已回答,但我不知道您是否可以保留。 – BrodieG