2012-04-12 3 views
2

Учитывая следующий вектор res и матричной команды. вектор res представляет индексы, и мне нужно извлечь только те имена, номер индекса которых находится в векторе res и gender = "F".Матрицы подмножества

Мне нужно сделать это в R и, поскольку я новичок в R, не смог решить это.

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

Мне нужно получить имена этих индексов в векторе res, которые соответствуют «F» в пол.Поэтому для приведенных выше данных мне нужно извлечь «shr», как в векторном res, а в матричной команде в [16] - «F» по полу. – pbd

+0

команда [res,] [команда [res,] $ genders == 'F',] – aatrujillob

+0

@AndresT - просто отметить - это решение потребует сначала преобразования матрицы в data.frame. – thelatemail

ответ

7

Существует много способов сделать это.

Вы можете первым выбрать, какие строки в res:

team$names[res] 

Затем вы можете выбрать, какие из них имеют gender быть "F":

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

Заметьте, что team$genders[res] выбирает из полов, соответствующих строкам в res, а затем вы фильтруете только те, которые являются женщинами.


Если вам понравилась, вы могли бы сделать это наоборот:

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

Здесь team$genders=="F" является логическим вектором длины nrow(team), будучи TRUE всякий раз, когда пол является «F» и FALSE иначе.

1:nrow(team) генерирует номера строк, а 1:nrow(team) %in% res - TRUE, если номер строки находится в res.

& говорит: «Убедитесь, что пол« F »и номер строки находится в res».


Можно даже сделать which(team$genders=="F"), которая возвращает вектор номеров строк для женщин, а затем сделать:

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

где числа intersect выбирает строки, которые присутствуют в какres и самок ,


И я уверен, что люди думают больше о путях.

+0

+1 для многих способов скинуть кошку :) – Tommy

+0

Я думаю, что метод 'intersect()' является самым чистым и удобным для чтения решением, но приятно видеть другие варианты. – thelatemail

+0

Все они выглядят так, как если бы командный объект был data.frame, где он был заявлен как матрица. –

7

Это должно работать, если ваш team является либо matrix или data.frame:

# 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" 

Основная идея заключается в том, чтобы получить показатели гендерных рядов «F» (с использованием which), а затем использовать заданная операция intersect - И это с вашими res индексами. Есть также union и setdiff варианты, которые могут быть полезны время от времени.

+0

Извините, Tommy, did not work, дал ошибку: Ошибка: индекс за пределами – pbd

+0

@PankajDeshmukh - Теперь он должен работать ... – Tommy

+0

@ Tommy- it did ... Спасибо ..! – 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" 
Смежные вопросы