2017-02-22 3 views
0
entsprechen

Ich habe einige Probleme beim Filtern nach doppelten Elementen in einer Zeichenfolge. Meine Daten sehen wie folgt aus:Filtern von Zeilen, die den Zeichenfolgenkondition in R

idvisit  path 
1   1,16,23,59,16 
2   2,14,19,14 
3   5,19,23 
4   10,21 
5   23,27,29,23 

Ich habe eine Spalte eine eindeutige ID und eine Spalte enthält einen Pfad für Webseite Navigation enthält. Die rechte Spalte enthält einige Fälle, in denen auf Seiten zweimal oder öfter zugegriffen wurde, aber einige verschiedene Seiten befinden sich zwischen diesen Zugriffen. Ich möchte nur() die Zeilen filtern, wo Seiten doppelt oder öfter vorkommen und mindestens eine Seite zwischen den beiden Zugriffen liegt, also sollten die Daten so aussehen.

idvisit  path 
1   1,16,23,59,16 
2   2,14,19,14 
5   23,27,29,23 

Ich möchte nur die Zeilen entfernen, die den Bedingungen entsprechen. Ich weiß wirklich nicht, wie man einen String behandelt, indem man eine Variable für die vielen verschiedenen Zahlen verwendet.

Antwort

1

Sie mit Filter basiert. Strings mit duplizierten Einträgen größer als ihre einzigartigen Längen, dh

df1[sapply(strsplit(as.character(df1$path), ','), function(i) length(unique(i)) != length(i)),] 
# idvisit   path 
#1  1 1,16,23,59,16 
#2  2 2,14,19,14 
#5  5 23,27,29,23 
+0

Das funktioniert perfekt! Vielen Dank :) Hast du einen nützlichen Link, über den ich selbst mehr über dieses String-Zeug erfahren kann? Ich habe viel im Internet gesucht, aber keine nützlichen Tipps für mein Problem gefunden? –

+0

Nun, die meisten von denen ich gelernt habe, lernte ich von hier um ehrlich zu sein – Sotos

1

Wir

library(data.table) 
lst <- strsplit(df1$path, ",") 
df1[lengths(lst) != sapply(lst, uniqueN),] 
# idvisit   path 
#1  1 1,16,23,59,16 
#2  2 2,14,19,14 
#5  5 23,27,29,23 

Oder eine Option versuchen, in jeder Saite auf die Anzahl der Elemente kann tidyverse

library(tidyverse) 
separate_rows(df1, path) %>% 
    group_by(idvisit) %>% 
    filter(n_distinct(path) != n()) %>% 
    summarise(path = toString(path)) 
+1

Das ist nicht die Situation nicht kümmern, wenn es gleiche Seite zweimal , aber keine andere Seite zwischen – ira

+0

@ira Aktualisiert den Beitrag – akrun

0

Sie reguläre Ausdrücke auch mit grepl versuchen könnten:

df[grepl('.*([0-9]+),.*,\\1', as.character(df$path)),] 
# idvisit   path 
#1  1 1,16,23,59,16 
#2  2 2,14,19,14 
#5  5 23,27,29,23 
Verwandte Themen