【问题标题】:Check column by column in R在R中逐列检查
【发布时间】:2014-01-10 15:05:44
【问题描述】:

我在匹配表中的两行时遇到问题

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

我想指定一个列号(比如第 5 列)并找出两个序列相同的列左右各有多少列。我想要一种机制,从中心开始逐个字符(逐列)比较这两个字符串并向外扫描,返回匹配字符的数量,直到遇到第一个差异

【问题讨论】:

  • 所以...ident&lt;-TRUE; while(ident) { ident&lt;-df2[1,5-j]==df2[2,5+j];j&lt;j+1} ?然后j 会告诉你(或j-1)你在不匹配之前走了多远。或者,拆分行、反转 LH 部分的顺序以及做一些字符串函数魔术可能更容易。
  • 你能不能更详细地解释一下答案的最后一点/
  • 好吧,就像r1right&lt;-df2[1,1:5] ; r1left &lt;- df1[1,6:(dim(df2)[2])]。然后 r1left&lt;-rev(r1left) ,然后找到或编写一些函数来计算有多少个字符是相同的 (r1left[j]==r1right[j]) 。可能不值得努力:-)
  • 你为什么要转发the same question,而且你评论的一个问题已经回答了?

标签: r character


【解决方案1】:

我认为对“连续数字”问题最有帮助的函数是rle,它计算向量的运行长度编码。例如,您可以通过以下方式查看字符串中相同或不同字符的运行长度:

r1 = "ghuytut3jilujshdftgu"
r2 = "ghuytuthjilujshdftgu"
spl1 = unlist(strsplit(r1, ""))
spl2 = unlist(strsplit(r2, ""))
rle(spl1 == spl2)
# Run Length Encoding
#   lengths: int [1:3] 7 1 12
#   values : logi [1:3] TRUE FALSE TRUE

对于您的问题,您希望从某个内部索引 i 开始计算匹配的运行长度,包括向前和向后。这是一个使用rle 的实现(函数假定字符串长度相同,i 是有效索引;向前和向后运行长度包括索引i 处的字符):

fxn = function(r1, r2, i) {
  spl1 = unlist(strsplit(r1, ""))
  spl2 = unlist(strsplit(r2, ""))
  if (spl1[i] != spl2[i]) {
    return(list(forward=0, backward=0))
  }
  rle.backward = rle(spl1[i:1] == spl2[i:1])
  rle.forward = rle(spl1[i:nchar(r1)] == spl2[i:nchar(r2)])
  return(list(forward=rle.forward$lengths[1], backward=rle.backward$lengths[1]))
}
fxn(r1, r2, 5)
# $forward
# [1] 3
# 
# $backward
# [1] 5

fxn(r1, r2, 9)
# $forward
# [1] 12
# 
# $backward
# [1] 1

【讨论】:

  • +1 用于使用我最喜欢的功能。不确定这对于非常大的字符串的扩展程度(时间损失)。
  • @CarlWitthoft 好点——在有很多差异的长字符串的情况下,它可能会比循环慢。
猜你喜欢
  • 2020-12-23
  • 1970-01-01
  • 2017-06-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多