2017-07-24 72 views
0

我在R中的數據框中有一個字符向量。我想在每個元素中查找關鍵字,引用關鍵字並調用一個新的向量,單詞是從我剛剛查找的關鍵詞開始的x個單詞。如何在R中解析時查找和引用關鍵字

例如,假設我有以下的數據幀:

> 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中查找單詞「高清」中的每個元素和之前立即返回字。因此,例如,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 「它會在我希望查找的關鍵字之前立即返回該單詞作爲參考。我想我很接近。這是我到目前爲止有:

> 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" ... 

這看起來我的關鍵字,返回元素的最後一個字。但問題依然存在,我如何引用我正在查找的關鍵字並返回距離它一定距離的相對距離?具體而言,我必須用什麼模式替換"(.*?)"才能在「def」之前立即返回單詞?

感謝您的幫助!

回答

1

這是我的解決方案。讓我知道,如果這是你要找的人:

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)) 
+0

完美!謝謝 – DataProphets