在 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))
我在 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))