2016-08-09 12 views
0

Ich habe einen großen Datenrahmen, den ich in verschiedene (kleinere) Datenrahmen aufteilen möchte, die ein Element in einer von zwei verschiedenen Spalten enthalten. Gehe ich davon aus, einen Datenrahmen wie die haben unten:Wie teilen Sie einen Datenrahmen nach einem Element in einer von zwei verschiedenen Spalten?

v1  v2  v3  v4  v5 
mom dad  2  4  5 
bro mom  5  3  4 
sis dad  3  4  2 
bro sis  3  7  9 

ich dies in 4 separate Daten teilen möchten Rahmen eine für jede der eindeutigen Werte in v1 oder v2. Der neue Datenrahmen sollte wie folgt aussehen:

$mom 
v1  v2  v3  v4  v5 
mom dad  2  4  5 
bro mom  5  3  4 

$dad 
v1  v2  v3  v4  v5 
mom dad  2  4  5 
sis dad  3  4  2 

$sis 
v1  v2  v3  v4  v5 
sis dad  3  4  2 
bro sis  3  7  9 

$bro 
bro mom  5  3  4 
bro sis  3  7  9 

ich in der Lage war für Schleife dies mit einem tun, aber ich mag, dass die End-Ausgabe eine Liste sein, so dass es einfach ist, Funktionen über jedes Element ausführen. Die for-Schleife ich verwendet habe, sieht wie folgt aus:

for(i in 1:length(us)){ 
    subset.dataframe <-dataframe[dataframe$v1 == us[i] | dataframe$v2 == us[i],] 
} 

, wo die „uns“ ist ein Vektor der einzigartigen Werte von den beiden (v1 und v2) Spalten kombiniert.

Vielen Dank im Voraus für jede Hilfe, die Sie zur Verfügung stellen können.

+0

Von der übermäßig kompliziert-Code-Abteilung - 'c (split (df, pmax (df $ v1, df $ v2)), Split (df, pmin (df $ v1, df $ v2))) ' – thelatemail

Antwort

2

Sie können einfach lapply verwenden, um durch us zu durchlaufen und den ursprünglichen Datenrahmen zu unterteilen, der eine Liste von Datenrahmen zurückgibt. Angenommen df ist Ihr Datenrahmen hier:

us = unique(c(df$v1, df$v2)) 
setNames(lapply(us, function(e) subset(df, v1 == e | v2 == e)), us) 

$mom 
    v1 v2 v3 v4 v5 
1 mom dad 2 4 5 
2 bro mom 5 3 4 

$bro 
    v1 v2 v3 v4 v5 
2 bro mom 5 3 4 
4 bro sis 3 7 9 

$sis 
    v1 v2 v3 v4 v5 
3 sis dad 3 4 2 
4 bro sis 3 7 9 

$dad 
    v1 v2 v3 v4 v5 
1 mom dad 2 4 5 
3 sis dad 3 4 2 
+0

Ich endete mit dieser Methode. Ich mag wirklich die Einfachheit davon. Danke für die Information. – Brett

+0

Kann ich fragen, was ist die Funktion (e)? Ist die 'e' nur Dummy-Variable? – Brett

+0

'Funktion (e) Teilmenge (df, v1 == e | v2 == e)' dies ist eine anonyme Funktion in R. 'e' ist der Funktionsparameter. Wenn wir 'lapply' benutzen, um durch uns hindurchzulaufen, nimmt e nacheinander den Wert von' us' an. – Psidom

1

Wir können auch tun, indem sie über den unique Wert Looping von unlist ersten beiden Spalten ed, dann verwenden which mit arr.ind = TRUE, um die Zeilen-Index zu erhalten und Teilmenge der Zeilen von ‚DF1‘

Un1 <- unique(unlist(df1[1:2])) 
setNames(lapply(Un1, function(nm) df1[which(nm == df1[1:2], 
      arr.ind = TRUE)[,1],]), Un1) 
#$mom 
# v1 v2 v3 v4 v5 
#1 mom dad 2 4 5 
#2 bro mom 5 3 4 

#$bro 
# v1 v2 v3 v4 v5 
#2 bro mom 5 3 4 
#4 bro sis 3 7 9 

#$sis 
# v1 v2 v3 v4 v5 
#3 sis dad 3 4 2 
#4 bro sis 3 7 9 

#$dad 
# v1 v2 v3 v4 v5 
#1 mom dad 2 4 5 
#3 sis dad 3 4 2 
+0

Danke, das hat gut funktioniert. – Brett

+0

@Brett Danke für die Notiz. Bitte denken Sie daran, die beste Lösung zu akzeptieren, indem Sie auf das Häkchen neben der Abstimmung klicken. – akrun

Verwandte Themen