R - 识别数据框中特定列的逗号分隔列表中的单词

R - Identify words in a comma-seperated list for a specific column in a dataframe

我在数据框中有一个特定的列,其中该列的每个单元格都有一个逗号分隔的单词列表,没有空格。我想在 each 单元格中找出两个特定单词(之一)的存在,当检测到该存在时,我想创建一个由 [= 填充的新列33=] 否则单元格为空。

例如,我想要检测存在的两个词是 'test word 1' 和 'test word 2'(请注意这两个测试词中每个词中都存在空格)。列中的每个单元格都是 'word1,word2, ......' 的形式(注意没有空格),可能包含也可能不包含两个测试词。

x_test <- c('test word 1','test word 2') 

我试过几种方法。但它们似乎都无法检测到测试词,因为整个单元格都被解释为一个大词,

A <- strsplit(current_cell, split=",")
B <- c(unlist(strsplit(A, split=",")) 
C <- lapply( df['col_name'],  B)

或者该方法似乎剥离了整个列并从中创建了一个巨大的列表。

C <- gsub(",([A-Za-z])", ", \1", df$col_name)

我也试过两个向量的交集,但也没用。

无论用什么方法得到C,我们都想问一下

df$test <- ifelse( C %in% x_test , 'yes', '')

如果没有 运行 上述问题,我如何在 R 中实现所有这些?

(这是我要操作的特定列的示例。在这种情况下,我定位的两个表达式是 'non-essential businesses' 和 'all businesses'):

entertainment,recreation,offices,tourism
entertainment,venues,non-essential businesses
hospitality,entertainment,fitness,beauty
all businesses
hospitality,entertainment,fitness
entertainment,religion,non-essential businesses

假设您有以下数据:

df <- data.frame(str = c("entertainment,recreation,offices,tourism",
"entertainment,venues,non-essential businesses",
"hospitality,entertainment,fitness,beauty",
"all businesses",
"hospitality,entertainment,fitness",
"entertainment,religion,non-essential businesses"))

和这些测试词:

test_words <- c("non-essential businesses", "all businesses")

然后你可以将测试词转换成交替模式:

test_words_patt <- paste0(test_words, collapse = "|")

并将该模式​​输入 grepl 以检测 str 中是否存在任何测试词,以及 ifelse 以便用“是”填充新列并且"":

library(dplyr)
df %>%
  mutate(test_word_is_present = ifelse(grepl(test_words_patt, str),
                                       "yes", 
                                       ""))
                                              str test_word_is_present
1        entertainment,recreation,offices,tourism                     
2   entertainment,venues,non-essential businesses                  yes
3        hospitality,entertainment,fitness,beauty                     
4                                  all businesses                  yes
5               hospitality,entertainment,fitness                     
6 entertainment,religion,non-essential businesses                  yes

base R中:

df$test_word_is_present <- ifelse(grepl(test_words_patt, df$str),
                                        "yes", 
                                        "")