2012-04-12 18 views
2

Betrachtet folgenden Vektor Res und Matrix-Team. der Vektor res repräsentieren Indizes, und ich brauche nur diejenigen Namen zu extrahieren, deren Indexnummer in Vektor res und Geschlecht = "F" ist.Subsetting-Matrizen

Ich muss dies in R tun und wie ich ein Neuling zu R bin, konnte dies nicht lösen.

res 
[1] 2 12 16 5 6 19 17 14 9 4 
team 
names  genders 
[1,] "aa"   "M"  
[2,] "ab"   "M"  
[3,] "al"   "M"  
[4,] "alp"   "M"  
[5,] "amr"   "F"  
[6,] "and"   "M"  
[7,] "an"   "M"  
[8,] "anv"   "F"  
[9,] "as"   "M"  
[10,] "ed"   "M"  
[11,] "neh"   "F"  
[12,] "pan"   "M"  
[13,] "poo"   "F"  
[14,] "ra"   "M"  
[15,] "roh"   "M"  
[16,] "shr"   "F"  
[17,] "sub"   "M"  
[18,] "val"   "M"  
[19,] "xi"   "M"  
+0

Ich brauche die Namen dieser Indizes in Vektor Res, die auf "F" im Geschlecht zuordnen.Also für die obigen Daten muss ich "shr" extrahieren, wie es in Vektor res ist, und in Matrix-Team bei [16,] ist "F" im Geschlecht. – pbd

+0

team [res,] [team [res,] $ geschlechts == 'F',] – aatrujillob

+0

@AndresT - nur um zu bemerken, dass diese Lösung die Umwandlung der Matrix in einen data.frame zuerst erfordert. – thelatemail

Antwort

7

Es gibt viele Möglichkeiten, dies zu tun.

Sie könnten zunächst auswählen, welche Zeilen in res:

team$names[res] 

Dann können Sie wählen, welche diejenigen haben gender"F" sein:

team$names[res][ team$genders[res]=="F" ] 

Beachten Sie, dass team$genders[res] Picks aus den Geschlechtern zu den Zeilen entsprechen, in res, und dann filtern Sie, um nur diejenigen zu akzeptieren, die weiblich sind.


Wenn Sie möchten, können Sie es umgekehrt machen:

team$names[ team$genders=="F" & (1:nrow(team) %in% res) ] 

Hier team$genders=="F" ist eine logische Vektor der Länge nrow(team), TRUE zu sein, wenn das Geschlecht ist „F“ und FALSE anders.

Die 1:nrow(team) generiert Zeilennummern und 1:nrow(team) %in% res ist TRUE, wenn die Zeilennummer in res ist.

Die & sagt "Stellen Sie sicher, dass das Geschlecht" F "UND die Zeilennummer ist in res".


Sie sogar which(team$genders=="F") tun könnte, die für Frauen einen Vektor von Zeilennummern zurückgibt, und dann tun:

team$names[ intersect( which(team$genders=="F") , res) ] 

wo die intersect Picks Zeilennummern, die in sowohlres und die Weibchen vorhanden sind .


Und ich bin sicher, dass Menschen mit mehr Möglichkeiten denken.

+0

+1 für die vielen Möglichkeiten, die Katze zu häuten :) – Tommy

+0

Ich denke, die 'intersect()' Methode ist die sauberste und lesbarste Lösung, aber es ist schön, andere Optionen zu sehen. – thelatemail

+0

Diese scheinen alle so zu agieren, als ob das Team-Objekt ein data.frame wäre, wo es als Matrix angegeben wurde. –

7

Dies sollte funktionieren, wenn Ihr team entweder ein matrix oder ein data.frame ist:

# emulate your data 
team <- data.frame(names=LETTERS, genders=rep(c("M","F"), 13)) 
res <- 10:26 

team[intersect(res, which(team[,"genders"]=="F")), "names"] 
#[1] J L N P R T V X Z 
#Levels: A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 

# Try with a matrix instead of data.frame 
team <- as.matrix(team) 
team[intersect(res, which(team[,"genders"]=="F")), "names"] 
#[1] "J" "L" "N" "P" "R" "T" "V" "X" "Z" 

Die Grundidee ist es, die Indizes der „F“ gender Zeilen zu erhalten (mit which) und verwenden Sie dann die eingestellte Operation intersect zu UND mit Ihren res Indizes. Es gibt auch union und setdiff Varianten, die manchmal nützlich sein können.

+0

Sorry Tommy, hat nicht funktioniert, gab Fehler: Fehler: Tiefgestellt außerhalb der Grenzen – pbd

+0

@PankajDeshmukh - Jetzt sollte es funktionieren ... – Tommy

+0

@ Tommy- es tat ... Danke ..! – pbd

2
team <- structure(c("aa", "ab", "al", "alp", "amr", "and", "an", "anv", 
"as", "ed", "neh", "pan", "poo", "ra", "roh", "shr", "sub", "val", 
"xi", "M", "M", "M", "M", "F", "M", "M", "F", "M", "M", "F", 
"M", "F", "M", "M", "F", "M", "M", "M"), .Dim = c(19L, 2L), .Dimnames = list(
    NULL, c("names", "genders"))) 

team[,"names"][ intersect( which(team[,"genders"]=="F") , res) ] 
#[1] "amr" "shr" 
team[,"names"][ team[,"genders"]=="F" & 1:NROW(team) %in% res ] 
#[1] "amr" "shr"