时间:2017-10-27 09:04:45

标签: r dataframe keyword matching

我有一个巨大的数据框和几个关键词(都是非数字的)。我想编写R代码来遍历整个数据框,并查找句子中包含一个或多个这些关键字的列。然后,如果匹配将关键字放在新列的同一行中(如果多个匹配,则将它们用逗号或新列分隔)。

例如,根据下面的数据,我想添加一个列,显示这些关键词的匹配内容:

keywords<- c("Smith", "Carla")

然后我希望结果看起来像这样:

**Names**          **Matching**

John Smith          Smith
Carla Smith         Carla, Smith **(could be same column or different column)**
Smith Smith         Smith
John Carla          Carla

我尝试使用grep

 Matching <- Data[grepl("carla",Data$Names), ]

你能帮帮我吗?

1 个答案:

答案 0 :(得分:0)

这个答案有两个部分:OP编辑了他的答案,但第一部分似乎仍然有用

第1部分:OP的原始问题

它通常有助于以较小的分解你的目标,并提供一个最小的例子。

所以这里有一些数据

shoes <- c("cookie", "nike", "adidas")
drinks <- c("water", "lemon", "cookie")
clothes <- c("pants", "cookie", "sweater")
df <- data.frame(shoes, drinks, clothes, stringsAsFactors = FALSE)
df

现在让我们来看看@ akrun的评论,试着看看我们是否可以获得字符串&#34; cookie&#34;从一栏:

library(stringr)
str_extract_all("cookie", df$shoes) == "cookie"

所以,这是有效的,现在我们需要为所有列做到这一点。为了帮助我们编写一个小函数并在列上循环它的方式:

extract_cookie <- function(x) {
    x <- as.character(x) # just to safeguard against non-string values .
    str_extract_all("cookie", x) == "cookie"
}
sapply(df, extract_cookie)
     shoes drinks clothes
[1,]  TRUE  FALSE   FALSE
[2,] FALSE  FALSE    TRUE
[3,] FALSE   TRUE   FALSE

第2部分:(在OP编辑问题之后)

由于您现在使用grepl ..

提及自己的努力
people <- c("John Smith", "Carla Smith", "Smith Smith", "John Carla")
persons <- data.frame(people, stringsAsFactors = FALSE)

persons$smiths <- grepl("Smith", persons$people)
persons$carlas <- grepl("Carla", persons$people)
persons$perfectMatch <- persons$smiths == TRUE & persons$carlas == TRUE

persons$smiths2 <- ifelse(grepl("Smith", persons$people), "Smiths", "")
persons$carlas2 <- ifelse(grepl("Carla", persons$people), "Carla", "")
persons$perfectMatch2 <- ifelse(persons$perfectMatch == TRUE, 
                                    paste(persons$carlas2, persons$smiths2), "")
persons

       people smiths carlas perfectMatch smiths2 carlas2 perfectMatch2
1  John Smith   TRUE  FALSE        FALSE  Smiths                      
2 Carla Smith   TRUE   TRUE         TRUE  Smiths   Carla  Carla Smiths
3 Smith Smith   TRUE  FALSE        FALSE  Smiths                      
4  John Carla  FALSE   TRUE        FALSE           Carla