下面是拆分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
請提供一個可重現的例子。這是一個矩陣嗎?這是一列數據框嗎? –
嘿..它是一個data.frame(我更新了anser)..這有幫助嗎? – user3069326
我刪除我的答案,因爲它不清楚你在問什麼。 – agstudy