2017-10-22 4 views
1

Wenn ich dies eine Matrix dieser Art:Wie kann ich eine Reihe von Zeilen aus einer Matrix extrahieren, um bestimmte Zeichen zu finden?

V1...................V2 
"Mateo"..............1 
"Marcos".............2 
"Lucas"..............3 
"Juan"...............4 
"Felipe".............5 
"Federicus"..........6 

Die Idee ist es, eine neue Matrix des gleichen Typs mit der Spalte V1 zu erzeugen, beispielsweise von Sekunde zu extrahieren her Zeile fragt:

If V1= "Marcos" & V1="Felipe" 

dann von Marcos Felipe anzuzeigen:

V1...................V2 
"Marcos".............2 
"Lucas"..............3 
"Juan"...............4 
"Felipe".............5 
+0

Verwenden 'which' die Reichweite und mit' seq' zu finden, die Reihenfolge bekommen. So etwas sollte funktionieren 'i1 <- mit (df1, match (c (" Marcos "," Felipe "), V1)); df1 [i1 [1]: i1 [2],] '. Ich nehme an, es ist ein data.frame – akrun

Antwort

1

Wir match verwenden können, um den Index zu bekommen und dann mit : erhalten die sequ ence

i1 <- with(df1, match(c("Marcos", "Felipe"), V1)) 
df1[i1[1]:i1[2],] 
#  V1 V2 
#2 Marcos 2 
#3 Lucas 3 
#4 Juan 4 
#5 Felipe 5 

Hier wird davon ausgegangen, dass es keine doppelten Namen gibt. Auch %in% ist nicht spezifisch, da es die Namen nicht unterscheidet.

+0

Was ist, wenn "Felipe" vor "Marcos" kommt? –

+0

@RuiBarradas Dann würde der Matchvektor umgedreht werden – akrun

1

Wenn einer der Namen mehr als einmal in V1 ist, gibt match nur den ersten Wert zurück. Aber es sollte alles zurückgeben. Siehe auch angepasstes Beispiel am Ende der Antwort. Sie können es mit which und range lösen.

mit:

r <- which(df$V1 %in% c("Marcos","Felipe")) 
df[Reduce(':', range(r)),] 

Sie erhalten:

 V1 V2 
2 Marcos 2 
3 Lucas 3 
4 Felipe 5 
5 Juan 4 
6 Felipe 5 

Angepasst Beispiel:

df <- read.table(text="Mateo 1 
Marcos 2 
Lucas 3 
Felipe 5 
Juan 4 
Felipe 5 
Federicus 6", header=FALSE) 
Verwandte Themen