2017-05-10 2 views
2

ich eine data.frame habe „dat“ und einen numerischen Vektor „test“:Vektor Vergleich der Reihe der Teilmenge in einem data.frame

code <- c("A22", "B15", "C03") 
v.1 <- 1:3 
v.2 <- 3:1 
v.3 <- c(2, NA, 2) 
bob <- c("yes", "no", "no") 
dat <- data.frame(code, v.1, v.2, v.3, bob, stringsAsFactors = FALSE) 
test <- c(3, 1, 2) 

Ich mag die Zeile in der data.frame zu finden, wo die zweite bis vierte Spalte ("v.1", "v.2", "v.3") enthalten die gleichen Werte wie der Vektor in der gleichen Reihenfolge und geben den Wert aus der "code" -Spalte (in dieser Fall "C03").

Ich versuchte

dat[dat[, 2:4] == test]$code 

und

which(apply(dat, 1, function(x) all.equal(dat[, 2:4], test)) == FALSE) 

von denen beide nicht funktionieren.

ich eine Lösung mit Basis R.

+1

row.names (Teilmenge (dat, dat $ v.1 == Test [1] & dat $ v.2 == test [2] & dat $ v.3 == test [3])) gibt die gewünschten Zeilen zurück. Wenn Sie den "code" -Wert für diese Zeilen wissen möchten, fügen Sie zu subset() function select = "code" hinzu. Es hilft dir, was? –

+0

@MarioM. Das funktioniert, aber für diese Lösung müsste ich alle Spaltennamen aus dem data.frame und alle Indizes für den Vektor eingeben, was für große Datenmengen etwas unhandlich ist. –

+3

, damit es mit Ihrer 2. Option funktioniert: 'which (apply (dat [, 2: 4], 1, Funktion (x) alle (x == Test))' – Cath

Antwort

0

Wir müssen nur replizieren, die ‚Test‘, bevor Sie den Vergleich die Längen gleich machen

dat[2:4] == test[row(dat[2:4])] 

Wenn wir den ‚Code benötigen bevorzugen '

dat$code[rowSums(dat[2:4] == test[row(dat[2:4])], na.rm = TRUE)==3] 
#[1] C03 
+3

Um die Zeilen zu erhalten, für die sie übereinstimmen, I fügt hinzu: 'dat $ code [which (apply (dat [2: 4] == test [col (dat [2: 4])], 1, Summe) == length (test))]' – R18

+0

@akrun For Aus irgendeinem Grund gibt Ihre Lösung, wenn sie mit meinen realen Daten anstelle der Beispieldaten in der Frage verwendet wird, den richtigen Code und eine Anzahl von NAs zurück: "P040105" NA NA NA NA NA NA, während die Lösung aus R18s Kommentar zurückkehrt nur der Code. –

+0

@what Kannst du 'dat $ code versuchen [rowSums (dat [2: 4] == test [row (dat [2: 4])]) == 3]' – akrun

1

Mit apply können wir die Spalten zusammen und überprüfen paste, welche Zeile die gleiche hat Wert wie der von test wenn zusammen eingefügt und die Spalte code der jeweiligen Zeile ausgewählt.

dat[apply(dat[2:4], 1, paste0, collapse = "|") == 
         paste0(test, collapse = "|"), "code"] 

#[1] C03 
2

Ihre zweite Option (mit which) nicht für mehrere Probleme arbeiten: mit apply auf ganze dat wandelt es in ein matrix von character, bist du eigentlich nicht x verwenden, das Funktionsargument und Sie sollten all verwenden anstelle von all.equal und wahrscheinlich TRUE anstelle von FALSE (der Vergleich wird eigentlich nicht benötigt).

Sie können es ein wenig ändern, damit es funktioniert:

which(apply(dat[, 2:4], 1, function(x) all(x==test))) 
[1] 3 

Oder

dat[apply(dat[, 2:4], 1, function(x) all(x==test)), "code"] 
[1] C03 
Verwandte Themen