我有一个带有'NAME'列的数据框,如下所示:
NAME
Cybermart co
Hot burgers hot sandwiches
Landmark co
我想在此数据框中添加一个新列,具体取决于: 是否在“名称”列中有任何重复的单词。 所以新专栏将是这样的:
REPEATED_WORD
No
Yes
No
我有什么方法可以做到这一点吗?
答案 0 :(得分:0)
我们可以分享名称' NAME'按空格列(\\s+
),循环输出list
并检查length
个unique
元素是否与每个length
相同{ {1}}元素获取逻辑list
。将逻辑向量转换为"是","否" (如果需要)
vector
如果我们使用df1$REPEATED_WORD <- c("No", "Yes")[sapply(strsplit(df1$NAME, '\\s+'),
function(x) length(unique(tolower(x)))!=length(x)) + 1L]
df1$REPEATED_WORD
#[1] "No" "Yes" "No"
,我们可以捕获非空白元素(regex
)并使用正则表达式外观来检查是否有任何重复的单词。
(\\S+)
最好将其保留为逻辑矢量,而不是转换为&#34;是/否&#34;。如果需要,只需将1添加到逻辑向量(或使用library(stringi)
stri_detect(tolower(df1$NAME), regex="(\\S+)(?=.*\\s+\\1\\s+)")
#[1] FALSE TRUE FALSE
)并将TRUE值更改为&#34;是&#34;和#34;否&#34; (如上所示)
答案 1 :(得分:0)
vapply(strsplit(tolower(x), "\\s+"), anyDuplicated, 1L) > 0L
#[1] FALSE TRUE FALSE
答案 2 :(得分:0)
我对@ akrun的第二个(纯正则表达式)有类似的解决方案。我将把它放在以后对未来的搜索者有用的时候:
NAME <-
c('Cybermart co',
'Hot burgers hot sandwiches',
'Landmark co'
)
grepl("(?i)\\b(\\w+)\\s+.*\\1\\b", NAME, perl=TRUE)
## [1] FALSE TRUE FALSE