Вопрос по r – Подмножества матриц

2

Учитывая следующий вектор res и матрицу команды. вектор res представляет индексы, и мне требуется извлечь только те имена, индекс которых находится в векторе res и пол = "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"    
мне нужно получить имена этих индексов в векторе res, которые отображаются на "F" в пол. Таким образом, для приведенных выше данных мне нужно извлечь "shr" как в векторном res, так и в матричной команде на [16,] равно «F»; в пол. pbd
@AndresT - только для того, чтобы отметить - это решение потребует сначала преобразования матрицы в data.frame. thelatemail
команда [Рез] [команда [Рез,] $ == & пол APOS, F & APOS ;,] aatrujillob

Ваш Ответ

3   ответа
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"
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& Quot ;.

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

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

гдеintersect выбирает номера строк, которые присутствуют вboth res и женщины.

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

@pdb - это означает, что вашteam это не список или data.frame.$ не работает с числовыми векторами или матрицами, только со списками и другими "рекурсивными" объекты. В своем ответе я использую[ вместо$ который работает на обоих.
я думаюintersect() Метод - самое чистое и удобочитаемое решение, но приятно видеть другие варианты.
+1 за множество способов скинуть кошку :)
Спасибо DWin .. но я получил ошибку, что $ не для атомарных векторов .. Понятия не имею, что это значит! pbd
Похоже, что все они действуют так, как если бы командный объект был 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), а затем используйте операцию setintersect И это с вашимres индексы. Это такжеunion а такжеsetdiff варианты, которые могут быть полезны в разы.

@PankajDeshmukh - Теперь это должно работать ...
Извините, Томми, не работает, выдал ошибку: Ошибка: индекс за пределами pbd
@ Томми, это так ... Спасибо ..! pbd

Похожие вопросы