2016-07-12 20 views
0

I-Daten in Spalte in zwei Spalten haben wie diesePaar die Daten in allen möglichen Kombinationen

Id Value 
1 a 
2 f 
1 c 
1 h 
2 a 

und ich möchte Paar die Daten der Spalte ‚Wert‘ in allen möglichen Kombinationen basieren auf derselben Id wie

(a,c) 
(a,h) 
(c,h) 
(f,a) 

Gibt es R oder Python oder VBA-Code, um diese Aufgabe zu erhalten?

+0

sind die Daten manuell eingegeben oder aus einer Datei lesen? – depperm

+0

@depperm Ich möchte die Daten aus einer Datei wie csv eingeben –

Antwort

2

eine Zeichenmatrix mit diesen Kombinationen zurückzukehren Basis R verwenden, versuchen

do.call(rbind, t(sapply(split(df, df$Id), function(i) t(combn(i$Value, 2))))) 
    [,1] [,2] 
[1,] "a" "c" 
[2,] "a" "h" 
[3,] "c" "h" 
[4,] "f" "a" 

Jede Zeile ist eine gewünschte Kombination.

Um dies ein wenig zu brechen, teilt split die Daten.frame per ID in eine Liste von zwei data.frames. Dann wird diese Liste und die combn Funktion gefüttert, um die paarweisen Kombinationen innerhalb dieser data.frames zu finden. Das Ergebnis von jedem data.frame (welches eine Matrix ist) wird transponiert, um mit t Ihre gewünschte Struktur zu passen. Schließlich wird diese Liste von Matrizen an do.call übergeben, die rbind verwendet, um die endgültige Matrix zurückzugeben.

Hinweis: Es wird davon ausgegangen, dass die Wertspalte ein Zeichen ist (nicht der variable Typ des lästigen Faktors). Dies wird leicht in der read. Familie von Funktionen, wie read.csv und erreicht, indem Sie das Argument as.is = TRUE zu Ihrer Lesefunktion hinzufügen (oder die längeren StringsAsFactors = FALSE). Wenn die Variable bereits ein Faktor ist, können Sie die Anweisung i$Value gegen Ende in as.character: as.character(i$Value) umbrechen, und sie wird wie gewünscht ausgeführt.

+0

@Immer Erstaunlich, aber was ist, wenn ich die Daten aus einer Datei zB eingeben möchten. CSV –

+0

@AndreaAngeli Dies sollte kein Problem sein. Verwenden Sie einfach 'df <- read.csv (..., as.is = TRUE)' und Sie sollten in Ordnung sein. Ich füge eine zusätzliche Notiz in meine Antwort ein. – lmo

+0

@Imo funktioniert es gut, aber ich möchte auch die Ausgabedaten im CSV-Format bekommen, wie kann ich? Sorry, aber ich bin ein Neuling auf R;) –

2

Mit R Sie könnten versuchen:

library(purrr) 

df %>% 
    split(.$Id) %>% 
    map(~ t(combn(.$Value, 2))) 

Welche gibt:

#$`1` 
#  [,1] [,2] 
#[1,] "a" "c" 
#[2,] "a" "h" 
#[3,] "c" "h" 
# 
#$`2` 
#  [,1] [,2] 
#[1,] f a 
#Levels: a c f h 
2

Nur ein weiterer Weg (möglicherweise etwas schneller, da es die Tatsache nutzt, dass Sie suchen alle Paare und vermeidet combn und t):

require(data.table) 
dt[, .(c1 = rep(Value, (.N:1)-1L), c2 = rep(Value, (1:.N)-1L)), by=Id] 
# Id c1 c2 
# 1: 1 a c 
# 2: 1 a h 
# 3: 1 c h 
# 4: 2 f a 

.N die Anzahl der Beobachtungen für jede Gruppe enthält .


wo dt ist:

dt = fread('Id Value 
1 a 
2 f 
1 c 
1 h 
2 a') 
+0

wenn ich die daten von einem externa csv eingeben will ist der code der selbe? –

Verwandte Themen