2016-05-13 8 views
0

Frage zu Datenmanipulationen. nicht HW, obwohl ich es als ein HW Problem ausdrücken werde. Ich weiß, dass es einen 3-zeiligen Weg gibt, dies zu tun, aber ich kann es nicht finden.Submatrix/Datenframe erstellen R

Problem
ich einen Datenrahmen A mit 10 Spalten und tausend Zeilen, ist es mit einigen Daten gefüllt. Ich habe eine 1-Spalten-Matrix B mit 1 Spalte und tausend Zeilen, es ist von 1 und 0 (wahr oder falsch) gefüllt.

Goal: Erstellen eines neuen Datenrahmen C die nur die Zeilen in A enthält, dass ein wahrer Wert des äquivalenten Index der Matrix C hatte.

(Mehr Klärung im Fall seines nicht klar) I durchgeführten Operationen auf A, gespeichert das Ergebnis (wahr oder falsch) in einer Spalte Datenrahmen (von gleicher Länge natürlich) und möchte nun, dass extrahieren in seine eigene Matrix.
Die Größe der neuen Matrix ist Summe (B) X 10 (nur ein logischer Abzug)

Vielen Dank für das Lesen! Deine Hilfe wird geschätzt.

Beispiel

Datenrahmen A

Name State metric1 metric2 

Joe  MA  23  25 
Moe  AZ  123  2971 
Bo  CA  938  387 
Yo  UT  1  3 

Matrix B

1 
0 
1 
0 

gewünschten Ausgang (Datenrahmen C)

Name State metric1 metric2 

Joe  MA  23  25 
Bo  CA  938  387 
+2

Es ist besser, ist reproduzierbar Beispiel ('dput') und die erwartete Ausgabe, die es einfacher zu machen für andere, Ihnen zu helfen. – Sotos

+1

Siehe den folgenden Link zum Erstellen eines [reproduzierbaren Beispiels] (http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example). – lmo

+0

Vielen Dank für Ihre Eingabe Jungs. Ich habe Sotos 'Rat gelesen und dies produziert. Reicht das? Ich denke, es ist sehr klar, aber natürlich würde ich das denken. Bitte lassen Sie es mich wissen, wenn das Beispiel nicht klarstellt. – OctaveParango

Antwort

1

Warum nicht einfach

A <- data.frame(cbind(A=1:10,B=21:30,C=41:50)) 
B <- data.frame(D=rep(c(TRUE,FALSE),5)) 
C <- A[B$D,] 

> A 
    A B C 
1 1 21 41 
2 2 22 42 
3 3 23 43 
4 4 24 44 
5 5 25 45 
6 6 26 46 
7 7 27 47 
8 8 28 48 
9 9 29 49 
10 10 30 50 
> B 
     D 
1 TRUE 
2 FALSE 
3 TRUE 
4 FALSE 
5 TRUE 
6 FALSE 
7 TRUE 
8 FALSE 
9 TRUE 
10 FALSE 
> C 
    A B C 
1 1 21 41 
3 3 23 43 
5 5 25 45 
7 7 27 47 
9 9 29 49 

EDIT nach OPs bearbeiten

A <- data.frame(cbind(name=c("Joe", "Moe", "Bo" , "Yo"), 
         State=c("MA","AZ","CA","UT"), 
         metric1 = c(23,123,938,1), 
         metric2 = c(25,2971,387,3))) 
B <- c(1,0,1,0) 
C <- A[B==1,] 
C 

geben

geben 210
> C 
    name State metric1 metric2 
1 Joe MA  23  25 
3 Bo CA  938  387 
+1

Und wenn Sie die Zeilen-IDs nicht mögen, können Sie sie immer wieder auf sequentiell zurücksetzen über 'roownames (C) <- 1: nrow (C)' – rbm

+0

Ja, das ist genau das Zeug, nach dem ich gesucht habe. Danke für deine Hilfe und Zeit !! – OctaveParango

1

Alternative data.table mit:

library(data.table) 

# convert you dataset into a data.table 
    setDT(A) 

# create a dummy variable (TRUE or FALSE) using operations other columns 
    A[ , logical := sum(metric1, metric1) > 50 ] 

# subset the data 
    A[ logical == T]