2017-03-06 3 views
0

lege ich Wert haben einen Datenrahmen wie dieseStellen Zeilen eine Spalte aus auf einem anderen Säulen basiert

V1 V2 
10 5 
20 4 
30 8 
40 6 
10 10 
20 7 
30 4 
40 9 

Und ich möchte alle auf die gleiche V1 in einer Reihe, wie so beziehen die Werte haben ..

. ist
V1 V2 V3 
10 5 10 
20 4 7 
30 8 4 
40 6 9 
+0

Wird es für jede eindeutige V1 genau zwei V-2 immer sein? –

+0

Ja, tatsächlich 100 V2s für jede eindeutige V1 – bgrantham

+0

Ist Reihenfolge in irgendeiner Weise wichtig? –

Antwort

1

Hier ist eine Lösung in Basis R. Sie können die unique in Reihe speisen V1 in einen lapply und extrahiert alle Werte in V2 für jede eindeutige V1. Dies füttern Sie in einen Aufruf von do.call (weil das Ergebnis von lapply ist eine Liste) mit rbind, und dann fusionieren Sie die resultierende Matrix mit dem Vektor von Uniques via CBIND.

# Create df1 for demonstration 
df1 = data.frame(a = rep(1:4, 10), b = sample(1:40)) 
output = cbind(unique(df1$a), do.call(rbind, lapply(unique(df1$a), function(x) df1$b[df1$a == x]))) 

Diese Lösung hängt davon ab, dass die Werte im Quelldatenrahmen vom gleichen Typ sind. Wenn dies nicht der Fall ist, müssen Sie möglicherweise etwas Zeit investieren, um die Daten in die richtigen Typen umzuwandeln. Aber das sollte kein Problem sein.

0

Mit den Funktionen zum Anwenden können Sie das tun, was Sie wollen.

DF <- data.frame(A = c(1:5,1:5),B=11:20) 

lst <- lapply(unique(DF$A),function(AA) DF[DF$A ==AA,'B']) 

Result <- do.call(rbind,lst) 

Wenn Sie die A-Säule zurück in die Sie verwenden können haben wollen Results <- cbind(A=names(lst),Results)

Vorsicht, dies wird Ihnen eine Matrix keinen data.frame. Wenn Ihre Werte nicht numerisch sind, wie in diesem Beispiel, können Probleme auftreten.

Es gibt einige alternative Möglichkeiten, dies mit Datentabellen oder dplyr zu tun.

0

Wir können dies tun, mit dcast von data.table

library(data.table) 
dcast(setDT(df1), V1~paste0("V", rowid(V1)+1)) 
# V1 V2 V3 
#1: 10 5 10 
#2: 20 4 7 
#3: 30 8 4 
#4: 40 6 9 
Verwandte Themen