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",
"")
我在数据框中有一个特定的列,其中该列的每个单元格都有一个逗号分隔的单词列表,没有空格。我想在 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",
"")