2017-07-24 3 views
0

Ich habe einen Zeichenvektor in meinem Datenrahmen in R. Ich möchte Schlüsselwörter in jedem Element nachschlagen, das Schlüsselwort referenzieren und zu einem neuen Vektor aufrufen, der je Das Wort ist eine x-Zahl von Wörtern entfernt von dem Schlüsselwort, das ich gerade gesucht habe.Wie nachschlagen und Referenz Schlüsselwörter beim Analysieren in R

Zum Beispiel sagen, dass ich die folgende Datenrahmen haben:

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

Und, würde Ich mag Vektor v3 erstellen, die das Wort „def“ in jedem Element nachschlägt und gibt das Wort unmittelbar vor. So zum Beispiel sollte v3 wie folgt aussehen:

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

Wie schreibe ich eine Funktion dies automatisch zu tun?

Ich habe eine Funktion, die ich verwendet habe, um Schlüsselwörter zu suchen und sie durch die gleiche Sache jedes Mal zu ersetzen. Veränderte für dieses Beispiel sieht es so etwas wie dieses:

> 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 

ich auf dieser Seite einige der Forschung getan haben und andere ein, was „TRUE“ mit, in f1 zu ersetzen, so dass anstelle der Rücksendung „TRUE, "Es gibt das Wort unmittelbar vor dem Schlüsselwort zurück, das ich als Referenz suchen möchte. Ich denke ich bin nah dran. Hier ist, was ich bis jetzt habe:

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

Dies sucht mein Schlüsselwort und gibt das letzte Wort des Elements zurück. Aber die Frage bleibt bestehen, wie referenziere ich das Keyword, das ich suche, und gebe ein Wort eine relative Entfernung davon zurück? Genauer gesagt, welches Muster muss ich ersetzen "(.*?)" mit, um das Wort unmittelbar vor "def" zurückzugeben?

Danke für die Hilfe!

Antwort

1

Hier ist meine Lösung. Lassen Sie mich wissen, ob dies ist, was Sie suchen:

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 

mit Sockel 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 

Um den einen nach dem bekommen ..

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

perfekt! Danke – DataProphets

Verwandte Themen