2016-09-01 146 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)) 
相關問題