当存在较短版本时,在 R 中排除字符串中的字符

In R exclude character in string when shorter version exists

数据是玩具示例。 have 中的每个字符都有字母。如果较短的字符包含 n-1 个字母,我想排除字符。 例如,ADB 被排除在外,因为我们有 AB。保留ADE是因为我们没有AD AE或DE。

have <- c('A,B', 'B,C', 'A,D,B', 'A,B,E', 'A,D,E')
want <- c('A,B', 'B,C', 'A,D,E')

我知道 grepl 可能有用,但我不确定如何以计算效率高的方式执行此操作。

这是一种拆分字符串的方法。

#Split the string on comma
tmp <- strsplit(have, ',')
#Iterate over the index of tmp
have[!sapply(seq_along(tmp), function(x) {
  one <- tmp[[x]]
  any(sapply(tmp[-x], function(y) sum(one %in% y)) >= (length(one) - 1) & 
      lengths(tmp[-x]) < length(one))
})]

#[1] "A,B"   "B,C"   "A,D,E"
  • sum(one %in% y) 计算当前字符串在另一个字符串中出现的字符数。

  • >= (length(one) - 1) 确保 n-1 of the letters 条件。

  • lengths(tmp[-x]) < length(one)确保它更短。