当存在较短版本时,在 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)
确保它更短。
数据是玩具示例。 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)
确保它更短。