我有一个从数据框中提取的子集矩阵,我怎样才能得到相应的行名?
I have a subset matrix extracted from a data frame, how can I get the corresponding row names?
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)
如何从数据框 A 中获取矩阵 B 的相应行名称 "b" 和 "d"?
如果我们是按元素比较,则将'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
可以使用包prodlim
中的函数row.match
,非常好用。它 returns 一个具有(第一个)匹配行号的向量,否则 NA
。您可以使用该向量(在本例中为 m
)来识别在 B
中找到匹配项的 A
的行名。
library(prodlim)
m <- row.match(A, B)
rownames(A)[!is.na(m)]
#[1] "b" "d"
您可以在 base R 中尝试的另一种方法
row.names(A)[A[,1] %in% B[,1] & A[,2] %in% B[,2]]
[1] "b" "d"
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)
如何从数据框 A 中获取矩阵 B 的相应行名称 "b" 和 "d"?
如果我们是按元素比较,则将'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
可以使用包prodlim
中的函数row.match
,非常好用。它 returns 一个具有(第一个)匹配行号的向量,否则 NA
。您可以使用该向量(在本例中为 m
)来识别在 B
中找到匹配项的 A
的行名。
library(prodlim)
m <- row.match(A, B)
rownames(A)[!is.na(m)]
#[1] "b" "d"
您可以在 base R 中尝试的另一种方法
row.names(A)[A[,1] %in% B[,1] & A[,2] %in% B[,2]]
[1] "b" "d"