2016-06-21 4 views
1
A=data.frame(Lat=(1:5),long=(6:10)) 
rownames(A)<-c("a","b","c","d","e") 
B=matrix(c(2,7,4,9),nrow=2,ncol=2, byrow=TRUE) 

Как получить соответствующие имена строк «b» и «d» для матрицы B из кадра данных A?У меня есть матрица подмножества, извлеченная из фрейма данных, как я могу получить соответствующие имена строк?

ответ

2

Вы можете использовать функцию row.match в пакете prodlim, что очень легко использовать. Он возвращает вектор с номерами строк (первых) совпадений и NA в противном случае. Вы можете использовать этот вектор (m в этом примере), чтобы идентифицировать имена розеток A, для которых совпадение было найдено в B.

library(prodlim) 
m <- row.match(A, B) 
rownames(A)[!is.na(m)] 
#[1] "b" "d" 
+0

спасибо милан за вас быстрый ответ! Я думаю, что ваш путь быстрый и эффективный! –

+0

@CHUNMING SHI; спасибо за комментарии и приветствуются! – milan

2

Если мы сравниваем поэлементно, а затем преобразовать «A» в matrix, проверить, соответствуют ли элементы %in% B, преобразование логического вектора matrix, получить индекс строки с which/arr.ind=TRUE и на основе этого найти имена строк.

row.names(A)[unique(which(`dim<-`(as.matrix(A) %in% B, dim(A)), arr.ind=TRUE)[,1])] 
#[1] "b" "d" 

Или, если мы сравниваем соответствующие столбцы в «A» и «B», мы можем сделать с mapply, получить rowSums, проверить, является ли это 2 и найти имена строк на основе этого индекса ,

row.names(A)[rowSums(mapply(function(x,y) x %in% y, A, as.data.frame(B)))==2] 

Или мы можем paste столбцы вместе и сравнить

row.names(A)[do.call(paste, A) %in% paste(B[,1], B[,2])] 
#[1] "b" "d" 

ПРИМЕЧАНИЕ: Все эти методы основаны на base R

+1

спасибо akrun! спасибо за так много решений! вы код действительно работает в моем случае! –

0

Другой метод, который вы можете попробовать в базе R

row.names(A)[A[,1] %in% B[,1] & A[,2] %in% B[,2]] 
[1] "b" "d" 

 Смежные вопросы

  • Нет связанных вопросов^_^