在R中,如何检查字符串是否包含不在列表中的子字符串?例如,假设您有字符串向量fruits <- c('apple,pear,orange', 'apple,pear', 'apple,banana', 'apple')
,并且您需要一个函数来告诉您特定元素是否具有不是苹果或梨的水果。在示例中,它将类似于
fruits <- c('apple,pear,orange', 'apple,pear',
'apple,banana', 'apple', 'pear,apple')
other_fruits(fruits)
# [1] TRUE FALSE TRUE FALSE FALSE
答案 0 :(得分:2)
如果您的字符串始终包含以逗号分隔的水果名称,则可以在没有正则表达式的情况下执行此操作,如下例所示,尽管下面的方法也可以修改为使用正则表达式。
fruits <- c('apple,pear,orange', 'apple,pear',
'apple,banana', 'apple', 'pear,apple')
sapply(strsplit(fruits,","), function(x) !all(x %in% c("apple","pear")))
[1] TRUE FALSE TRUE FALSE FALSE
或者,一般来说:
other_fruits = function(string, fruit_check) {
sapply(strsplit(string,","), function(x) !all(x %in% fruit_check))
}
other_fruits(fruits, c("apple","pear"))
或者说,你想要回归选择水果以外的水果:
other_fruits = function(string, fruit_check) {
lapply(strsplit(string,","), function(x) {
if (all(x %in% fruit_check)) NA else x[!(x %in% fruit_check)]
})
}
other_fruits(fruits, "apple")
[[1]] [1] "pear" "orange" [[2]] [1] "pear" [[3]] [1] "banana" [[4]] [1] NA [[5]] [1] "pear"
答案 1 :(得分:0)
您可以创建索引以查看水果的显示位置:
fruits <- c('apple,pear,orange', 'apple,pear',
'apple,banana', 'apple', 'pear,apple', 'mango')
str <- unique(unlist(strsplit(fruits,",")))
dat <- sapply(str, grepl, fruits)
dat
apple pear orange banana mango
[1,] TRUE TRUE TRUE FALSE FALSE
[2,] TRUE TRUE FALSE FALSE FALSE
[3,] TRUE FALSE FALSE TRUE FALSE
[4,] TRUE FALSE FALSE FALSE FALSE
[5,] TRUE TRUE FALSE FALSE FALSE
[6,] FALSE FALSE FALSE FALSE TRUE
计算不同水果与苹果或梨的出现次数;
apply(dat[,3:ncol(dat)], 1, sum)
或者创建一个逻辑向量来指示其他成果的位置;
as.logical(apply(dat[,3:ncol(dat)], 1, sum))