2017-10-27 6 views
0

Ich habe ein riesiges Dataset, von dem ich nach einigen Kriterien abgeglichene Samples benötige. Zum Beispiel, für jeden Filmstar in einem Ort und Stadtteil finde ich zwei Personen (zufällig), die keine Filmstars sind. Es ist 1 für Filmstar und 0 für Nicht-Filmstar.Finde übereinstimmende Paare und ihre IDs für übereinstimmende Datensätze

location<- c('manhattan', 'manhattan' ,'manhattan', 'manhattan', 'manhattan', 'manhattan') 
moviestar<- c(0,1,0,0,0,1) 
id<- c(1,2,3,4,5,6) 
borough <- c('williamsburg', 'williamsburg', 'williamsburg', 'williamsburg', 'williamsburg','williamsburg') 

df<- data.frame(location,moviestar, borough, id) 

Ich möchte eine Teilmenge erzeugen, die Paare von Filmstar mit zwei anderen nicht-Filmstars (zufällig ausgewählt) leben in der gleichen Position und Gemeinde abgestimmt hat. Irgendwelche Ratschläge? Im Wesentlichen dort sind 6 Leute, die in Manhattan leben und dort sind zwei Sterne, die in Manhattan leben und ich möchte für jeden Stern zusammenpassen, in diesem Fall, 2 und 6 sind Sterne, dann möchte ich gepaarte Paare in den abschließenden Daten haben wie folgt (einige zufällige Paare):

Der Ausgang ich erwarte so ist,

matcheddata 
    location moviestar borough  id matchpairid 
    manhattan 1 williamsburg 2 match1 
    manhattan 0 williamsburg 1 match1 
    manhttan  0 williamsburg 5 match1 
    manhattan 1 williamsburg 6 match2 
    manhattan 0 williamsburg 3 match2 
    manhttan  0 williamsburg 5 match2 

Antwort

0

Dies ist ein weiterer Ansatz, um direkt das erwartete Ergebnis zu produzieren, wobei jede Zeile eines Filmstars durch zwei Reihen von zufällig ausgewählten Nicht-Filmstars folgt:

library(data.table) 
setDT(df)[, { 
    n_stars <- .SD[moviestar == 1, .N] 
    rbind(.SD[moviestar == 1], .SD[moviestar == 0][sample.int(.N, 2L * n_stars)])[ 
    , pairid := rep(1:n_stars, 3L)][order(pairid)] 
}, by = .(location, borough)] 
location  borough moviestar id pairid 
1: manhattan williamsburg   1 2  1 
2: manhattan williamsburg   0 3  1 
3: manhattan williamsburg   0 1  1 
4: manhattan williamsburg   1 6  2 
5: manhattan williamsburg   0 4  2 
6: manhattan williamsburg   0 5  2 
1

Dies sollte es tun:

library(data.table) 
setDT(df)[, .(moviestar.id = id[moviestar == 1], 
       match.id = sample(id[moviestar == 0], 2*sum(moviestar == 1))) 
      , by = .(location, borough)] 
# location  borough moviestar.id match.id 
#1: manhattan williamsburg   2  3 
#2: manhattan williamsburg   6  5 
#3: manhattan williamsburg   2  1 
#4: manhattan williamsburg   6  4 

Sie können es massieren, was auch immer Sie Form wie später .

+0

Ich bin nicht bekomme ich die Ausgabe wie erwartet, für jeden Stern möchte ich zwei Nicht-Sterne haben, es gibt mir nur 4 Zeilen nach der Iteration, und ich konnte das Match-Paar nicht den Stern mit ID 2 bekommen, irgendwelche Gedanken? danke dir :) – user3570187

+0

Ich habe die obige Ausgabe hinzugefügt, so dass Sie expliziter kommentieren können, dass das nicht das ist, wonach Sie gefragt haben. Wie Sie oben sehen können, gibt es für jeden Stern 2 übereinstimmende Nicht-Sterne. – eddi

+0

2 ist ein Stern und ich brauche zwei passende Paare, die keine Sterne sind (wie die Datensätze 1, 3,5) und zwei für den Stern mit der ID 6. Aber in deinem Fall sehe ich keine Nicht-Filmstars. Bitte beachten Sie die Ausgabe, die ich in meiner Frage habe. Vielen Dank !! – user3570187

Verwandte Themen