2016-04-10 14 views
0

Ich habe einen Datenrahmen mit Spalte ‚NAME‘ wie folgt aus:Count wiederholte Wörter in einer Spalte R

NAME        
Cybermart co            
Hot burgers hot sandwiches      
Landmark co         

Ich möchte eine neue Spalte in diesem Datenrahmen hinzuzufügen, abhängig von: ob es irgendein Wort, das wird in der Spalte "Name" wiederholt. So ist die neue Spalte würde so aussehen:

REPEATED_WORD 
No 
Yes 
No 

Gibt es eine Möglichkeit, dies zu tun?

+0

Was haben Sie versucht? Warum hat es nicht funktioniert? – Heroka

Antwort

0
vapply(strsplit(tolower(x), "\\s+"), anyDuplicated, 1L) > 0L 
#[1] FALSE TRUE FALSE 
0

Wir können te ‚NAME‘ Spalte durch Leerzeichen aufgespalten (\\s+), eine Schleife über den Ausgang list und prüfen, ob die von lengthunique Elemente die gleiche wie die jedes lengthlist Element sind eine logische vector zu erhalten. Konvertieren Sie die logische Vektor auf „Ja“, „Nein“ (falls erforderlich)

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" 

Wenn wir regex verwenden, können wir nicht-weiße Raumelemente erfassen ((\\S+)) und regex lookarounds verwenden zu überprüfen, ob Es gibt ein wiederholtes Wort.

Es ist besser, es als logischen Vektor zu belassen, anstatt in "Ja/Nein" zu konvertieren. Wenn das braucht nur 1 zu dem logischen Vektor hinzufügen (oder mit ifelse) und den wahren Werten ändern, um „Ja“ und FALSE auf „Nein“ (wie oben gezeigt)

0

Ich hatte eine ähnliche Lösung zu @ akruns zweite (pure regex). Ich werde es für den Fall, dass es für zukünftige Suchenden nützlich ist:

NAME <-       
c('Cybermart co', 
'Hot burgers hot sandwiches', 
'Landmark co' 
) 

grepl("(?i)\\b(\\w+)\\s+.*\\1\\b", NAME, perl=TRUE) 
## [1] FALSE TRUE FALSE 
Verwandte Themen