2016-09-01 144 views
0

在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 

回答

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" 
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)) 
相关问题