在 R 中解析时如何查找和引用关键字

How to Lookup and Reference Keywords when Parsing in R

我在 R 中的数据框中有一个字符向量。我想在每个元素中查找关键字,引用所述关键字,然后调用一个新的向量,哪个单词是 x 字数来自我刚刚查找的关键字。

例如,假设我有以下数据框:

> v1 <- c(1:5)
> v2 <- c("abc def ghi", "jkl mno def", "pqr stu vwx", "abc def yz", "ghi jkl mno def")
> sample <- as.data.frame(cbind(v1, v2))
> sample$v1 <- as.numeric(sample$v1)
> sample$v2 <- as.character(sample$v2)
> sample
  v1              v2
1  1     abc def ghi
2  2     jkl mno def
3  3     pqr stu vwx
4  4      abc def yz
5  5 ghi jkl mno def
> str(sample)
'data.frame':   5 obs. of  2 variables:
 $ v1: num  1 2 3 4 5
 $ v2: chr  "abc def ghi" "jkl mno def" "pqr stu vwx" "abc def yz" ...

而且,我想创建向量 v3 来查找每个元素中的单词 "def" 和紧接在前的单词 return。因此,例如,v3 应如下所示:

> v3
[1] "abc" "mno" NA    "abc" "mno"

如何编写一个函数来自动执行此操作?

我有一个功能,我一直在使用它来查找关键字并每次都用相同的东西替换它们。针对此示例进行了更改,它看起来像这样:

> f1 <- function(df, cols, match_with, to_x = 'def'){
+   df[cols] <- lapply(df[cols], function(i) 
+     ifelse(grepl(to_x, match_with, fixed = TRUE), TRUE, 
+            i))
+   return(df)
+ }
> sample$v3 = NA
> sample = f1(sample, cols = c('v3'), match_with = sample$v2)
> sample
  v1              v2   v3
1  1     abc def ghi TRUE
2  2     jkl mno def TRUE
3  3     pqr stu vwx   NA
4  4      abc def yz TRUE
5  5 ghi jkl mno def TRUE
> str(sample)
'data.frame':   5 obs. of  3 variables:
 $ v1: num  1 2 3 4 5
 $ v2: chr  "abc def ghi" "jkl mno def" "pqr stu vwx" "abc def yz" ...
 $ v3: logi  TRUE TRUE NA TRUE TRUE

我在这个网站和其他网站上做了一些研究,在 f1 中用什么替换 "TRUE",这样,而不是 returning "TRUE,"它 return 是我要查找作为参考的关键字之前的单词。我想我很接近了。这是我目前所拥有的:

> ptn <- "(.*? )"
> f2 <- function(df, cols, match_with, to_x = 'def'){
+   df[cols] <- lapply(df[cols], function(i) 
+     ifelse(grepl(to_x, match_with, fixed = TRUE), gsub(ptn, " ", sample$v2), 
+            i))
+   return(df)
+ }
> sample$v3 = NA
> sample = f2(sample, cols = c('v3'), match_with = sample$v2)
> sample
  v1              v2     v3
1  1     abc def ghi    ghi
2  2     jkl mno def    def
3  3     pqr stu vwx   <NA>
4  4      abc def yz     yz
5  5 ghi jkl mno def    def
> str(sample)
'data.frame':   5 obs. of  3 variables:
 $ v1: num  1 2 3 4 5
 $ v2: chr  "abc def ghi" "jkl mno def" "pqr stu vwx" "abc def yz" ...
 $ v3: chr  "  ghi" "  def" NA "  yz" ...

这会查找我的关键字和 return 元素的最后一个词。但问题仍然存在,我如何引用我正在查找的关键字和 return 一个与它相距一定距离的词?具体来说,我必须用什么模式将 "(.*? )" 替换为 return 紧接在 "def" 之前的单词?

感谢您的帮助!

这是我的解决方案。让我知道这是否是您要找的:

library(dplyr)
sample %>% mutate(v3=gsub("(\w+\s)*(\w+)\sdef.*","\2",v2),v3=ifelse(v2==v3,NA,v3))
# v1              v2   v3
# 1  1     abc def ghi  abc
# 2  2     jkl mno def  mno
# 3  3     pqr stu vwx <NA>
#   4  4      abc def yz  abc
# 5  5 ghi jkl mno def  mno

带基数 R

sample$v3 <- gsub("(\w+\s)*(\w+)\sdef.*","\2",sample$v2)
sample$v3[sample$v3==sample$v2] <- NA
# v1              v2   v3
# 1  1     abc def ghi  abc
# 2  2     jkl mno def  mno
# 3  3     pqr stu vwx <NA>
#   4  4      abc def yz  abc
# 5  5 ghi jkl mno def  mno

要获得后..

sample %>% mutate(v3=gsub("(\w+\s)*def\s(\w+)(\s\w+)*","\2",v2),v3=ifelse(v2==v3,NA,v3))