2016-04-13 16 views
-1

eingegeben werden Ich verwende eine Stichprobenmethode zu einem Daten über 700000 Zeile und 5 Spalten für den vollständigen Datensatz. Die Spalten sind, x1; x2; x3; x4; y.
Nachdem ich die Methode in Matlab für die Sampling-Methode verwendet habe, habe ich rund 400000 Stichproben-Datensatz. Das Problem ist jedoch, dass die Methode nicht das "y" abgetastet hat, was bedeutet, dass "y" im vollständigen Datensatz und getrennt von x1; x2; x3; x4 ist. Seit Wochen habe ich versucht, den Code wieder herauszufinden und immer noch das "y" wird nicht abgetastet. Daher muss ich einen anderen Weg finden, um den Datensatz anzupassen. Die Sampling-Methode hat den gesamten Datensatz nicht randomisiert, deshalb ist es besonders in Ordnung, aber die Sampling-Methode entfernt ein paar Datensätze. Dies ist der Screenshot der DatenWie eingegebene fehlende Daten aus dem vollständigen Dataset in R

Full Dataset and Sampled

So ist die über dem Screenshot ist, wir von der „FULL DATASET“ sehen können, nimmt das abgetastete nur wenige Daten. Die hervorgehobene blaue Farbe von "FULL DATASET" sind die Daten, die in "Sampled" aufgenommen wurden, während die schwarze Textfarbe in "FULL DATASET" entfernt wurde. Aus diesem Grund sind keine Daten aus der schwarzen Textfarbe im vollständigen Datensatz in "Sampled" enthalten. Von der "Sampled" fehlt das Y, ich kann das manuell ausfüllen, aber es würde sehr lange dauern, da die gesampelten Daten einen Datensatz von 400000 haben. Also, wie kann ich das "Y" in "Sampled" aus dem "Full Dataset" ausfüllen, die mit R Datenrahmen abgetastet wurden?

aktualisieren

 inputdata <- function(pop,sam) 
    { 

    dfpop <- data.frame(pop) 
    dfsam <- data.frame(sam) 
    ndfpop = nrow(dfpop) 
    ndfsam = nrow(dfsam) 

    for (i in 1:ndfsam) { 
    if(dfsam[i,1] == dfpop[i,1] && dfsam[i,2] == dfpop[i,2] && dfsam[i,3] == dfpop[i,3] && dfsam[i,4] == dfpop[i,4]) { 
     completesam<- print(dfpop[i,5] == dfsam[i,5]) 
    } 
    } 
write.csv(completesam, file = "D://completesampling.csv") 
} 

Früher verwendete ich für diesen Fall Excel, aber da die Arbeit R bevorzugen verwendet i statt R. Die Funktion FALSE zurück entlang der Reihe, und ich habe mehrere Ausdruck in der IF

[1] FALSE 
[1] FALSE 
[1] FALSE 
[1] FALSE 
[1] FALSE 
[1] FALSE 
[1] FALSE 
[1] FALSE 
[1] FALSE 
[1] FALSE 

Haben Sie eine Idee haben, ist, welcher Teil des Codes fehlt?

+2

Bitte sehen Sie diese Frage: http://stackoverflow.com/questions/1299871/how-to- join-merge-data-frames-innen-außen-links-rechts. Kann wegen der Kopfgelder nicht schließen, aber das sollte definitiv sein. Beachten Sie auch, dass Sie, wenn Sie mehrere Y-Werte für Kombinationen von X1, X2, X3 und X4 haben, Y – Chris

+0

@Chris nicht korrekt ziehen können, obwohl Sie es für den Moderator zum Schließen kennzeichnen können: http: //meta.stackexchange. com/questions/14591/how-can-we-close-questions-with-bounties – dww

+0

Beantwortet der Typ Ihre Frage? Wenn es so ist, schließe ich das als Täter und erstatte das Kopfgeld zurück. –

Antwort

-1

Schließlich komme ich mit dieser und die Dinge in Ordnung, vielen Dank für Ihre Antwort

populationHC <- read.csv("E:/populationHC.csv") 
sampledHC <- read.csv("E:/sampledHC.csv") 

nsampled = dim(sampledHC)[1] 
npopulation = dim(populationHC)[1] 

for (i in 1:nsampled) 
{ 
    j = 1 
    check = 0 
    while (check < 4) 
    { 
    j = j+1 
    if (sampledHC[i,1]==populationHC[j,1]){check1=1}else{check1=0} 
    if (sampledHC[i,2]==populationHC[j,2]){check2=1}else{check2=0} 
    if (sampledHC[i,3]==populationHC[j,3]){check3=1}else{check3=0} 
    if (sampledHC[i,4]==populationHC[j,4]){check4=1}else{check4=0} 
    check = check1 + check2 + check3 + check4 
    } 
    sampledHC[i,5]=populationHC[j,5] 
    print(paste('Sampled data -',i)) 
} 

write.csv(sampledHC, "E:/HCsampled.csv") 
2

Wenn Sie INDEX Formel verwenden, wenn Sie mehrere Spalten als Referenzfeld (Spalte A bis D in Ihrem Fall) geben werden müssen Sie Spaltennummer als dritten Parameter (1 bis 4 in diesem Fall) geben. Wenn Sie die folgende Formel verwenden, erhalten Sie keine Fehlermeldung.

=INDEX($A$3:$D$500002,MATCH($E$3,E3:$E$500002,0),1) 

Aber die mit Ihrem MATCH Formel Sie Zeilennummer 3 jedes einzelne Mal, als Rückgabewert erhalten wird. Sie erhalten also mit dieser Formelkombination den gleichen Wert. Statt $E$3 benötigen Sie einen zu vergleichenden Wert im Array E3:$E$500002. Sie müssen jedoch auch eindeutige Werte im Sucharray vergleichen, da diese Suchformeln den ersten Wert zurückgeben, den sie im Array finden. Sie werden also den zweiten Wert nicht finden können, wenn ein Duplikat vorhanden ist.

Was ich vorschlagen (wenn es möglich ist), fügen Sie eine neue Spalte als erste Spalte Ihres Datasets und benennen Sie als "Record Number", die 1 bis 700K ist, eine inkrementelle Anzahl für jede Zeile.

Dann als auf der rechten Seite können Sie die 6. Spalte (Y) Wert mit einer Lookup-Formel zurückgeben.

+0

Vielen Dank für Ihre Antwort, aber im Moment änderte sich die Arbeit in R – user3292755

3

Wenn Sie wissen, dass jede Kombination einzigartig ist (zwischen x1, x2, x3, x4), Recommand I merge

data.frame <- merge(dfsam, dfpop, by = c("x1", "x2", "x3", "x4"), all = F) 

Dieser Code sollte die Y-Spalte hinzufügen, wenn es eine Übereinstimmung zwischen den vier anderen Spalten ist Werte.

[EDIT]

schrieb ich den Anfang Ihrer Daten, wenn merge um zu sehen, wirklich funktionieren kann.

dfpop = data.frame(x1 = c(4, 3, 0, 2, 1, 4, 2, 0, 3, 0, 0, 2, 0, 0, 3, 0, 2, 0, 4, 0, 2, 1, 0), 
      x2 = c(7500, 14600, 5700, 7500, 7800, 7500, 7500, 6648, 7886, 6858, 
        8077, 7600, 8077, 8077, 7500, 8077, 14600, 7600, 3500, 14172, 
        7600, 7500, 7500), 
      x3 = c(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), 
      x4 = c(1, 1, 0, 1, 1, 0, 1, 0, 0, 1, 0, 0, 1, 1, 1, 1, 1, 0, 1, 1, 0, 1, 1), 
      y = c(0, 0, 1, 1, 1, 0, 1, 1, 0, 1, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1)) 


dfsam = dfpop[c(5,17,23),c("x1", "x2", "x3", "x4")] # 3 highlighted lines without y column 

df = merge(dfsam, dfpop, by = c("x1", "x2", "x3", "x4")) # merging the 2 data.frames 

> print(df) 
    x1 x2 x3 x4 y 
1 0 7500 0 1 1 
2 1 7800 0 1 1 
3 2 14600 0 1 1 

Wie Sie zum dfsam data.frame sehen kann, wird die y Spalte korrekt hinzugefügt. Es gibt keine Probleme mit der unterschiedlichen Vektorlänge.

Ich vermute, dass Sie möglicherweise einen Fehler in den Quelldaten haben.

+0

Danke, ich denke, "Merge" kann für diesen Fall nützlich sein, aber das passiert, wenn ich versuchte die Funktion 'Fehler in merge.data.frame (dfsam, dfpop, durch = c (" x1 "," x2 "," x3 "," x4 "),: negative Länge Vektoren sind nicht erlaubt' Ist dies passiert, weil ich unterschiedliche Länge des Vektors habe? 'dfsam' haben 386431 Reihe, während' dfpop' 709899 Reihe haben. So ist der Unterschied groß genug – user3292755

-1

Versuchen Sie nur, eine Stichprobe Ihres Datenrahmens zu nehmen? Das ist einfach, mit so etwas zu tun:

mtcars[sample(seq_along(mtcars[, 1]), 20, FALSE), ] 

Was Du mit diesem Ansatz tut, ist eine zufällige Reihe von Zahlen von 1 bis zur Anzahl der Zeilen im Dataset erstellen, dann 20 Zufallszahl aus dieser Datenmenge unter . Sie können das dann an die Teilmengenoperation zurückgeben, um nur die Zeilen zu erhalten, die diesen Zahlen entsprechen. Das "FALSE" zeigt an, dass das Sampling ohne Ersetzung stattfinden soll, was Sie wollen, wenn Sie nicht Bootstrapping machen.