簡體   English   中英

R - 識別數據框中特定列的逗號分隔列表中的單詞

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

我在數據框中有一個特定的列,該列的每個單元格都有一個逗號分隔的單詞列表,沒有空格。 我想在每個單元格中挑選出(其中一個)兩個特定單詞的存在,當檢測到該存在時,我想創建一個由“是”填充的新列,否則該單元格為空白。

例如,我想檢測存在的兩個單詞是“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 中實現所有這些?

(這是我要操作的特定列的示例。在這種情況下,我針對的兩個表達式是“非必要業務”和“所有業務”):

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以檢測strifelse中是否存在任何測試詞,以便用“yes”和“”填充新列:

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", 
                                        "")

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM