r语言 - 我如何识别两个数据矩阵之间的哪些列和行匹配?



我有两个不同维度的数据矩阵存储为R中的对象(我在Windows 10中使用Rstudio与R v4.0.2):

m1 = 1列x 44行(这是一个没有空格的名字列表)。

m2 = 500,000列x 164行(这包含一个字符串,第一行是一个名称列表)。

我想检查m1的行中有多少(以及哪些)在m2中找到(这意味着它将在0到44之间的任何地方)。最终目标是我有4000个不同的矩阵来代替m2的位置,并且我需要查看所有m2s中缺失条目(在m1中找到)的范围(即,我正在查看这44个名称的缺失数据的范围)。

我仍然是R的初学者,所以如果我的描述有点偏离,请道歉。

我尝试存储每个矩阵,保存为CSV文件,如下:

m1 <- read.csv("names-file.csv")

m2 <- read.csv("data-file.csv")

,并尝试使用prodlim包中的row.match函数,并运行row.match(m1, m2),但只得到数值。我只是想看看m1(第一列)中有多少名字在m2(第一列)中找到,这些值是什么,以及百分比是多少(x/44)。

举例:m1 =

Tom
Harry
Cindy
Megan
Jack

m2 =

Tom       XXXXXXXXXXXX----XXXXXXXX
Stephanie XXXXXXXXXXXXXXXX----XXXX
Megan     XXXXXXXXXXXXXXXXXXXXXXXX
Ryan      XXXXXXXXXXXXXXXXXXXXXX-X
David     XXXXXX---XXXXXXXXXXXXXXX
Josh      XXXXXXXXXXXXXXXXXXXXXXXX

在m2矩阵中,每个名字是列1,每个后续的X(表示A、T、C或G)是后续的列(因此有些列有A、T、C或G,或"-")我想写一个代码,可以看到有多少名字从m1和发现在m2(相反,多少数据从m2作为一个百分比丢失)。在这种情况下,期望的输出将是:

2
Tom
Megan
60% 
以下是我使用dput()的具体数据文件(请让我知道我是否正确使用dput()):m1:
structure(list(V1 = c("Taxon1", "Taxon2", "Taxon3", "Taxon4", 
"Taxon5", "Taxon6", "Taxon7", "Taxon8")), class = "data.frame", row.names = c(NA, 
-8L))

m2:

structure(list(V1 = c("Taxon1", "Taxon3", "Taxon4", "Taxon6", 
"Taxon7", "Taxon9", "Taxon10", "Taxon11", "Taxon12", "Taxon13", 
"Taxon14", "Taxon15", "Taxon16", "Taxon17", "Taxon18", "Taxon19", 
"Taxon20", "Taxon21", "Taxon22", "Taxon23", "Taxon24", "Taxon25", 
"Taxon26", "Taxon27", "Taxon28", "Taxon29", "Taxon30"), V2 = c("A", 
"A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", 
"A", "A", "A", "A", "A", "A", "C", "C", "C", "C", "C", "C", "C"
), V3 = c("G", "G", "G", "G", "G", "C", "C", "G", "G", "G", "G", 
"G", "G", "G", "G", "G", "G", "G", "G", "G", "G", "G", "G", "G", 
"G", "G", "G"), V4 = c("C", "C", "C", "C", "C", "T", "G", "C", 
"C", "C", "C", "C", "C", "C", "C", "C", "C", "C", "C", "C", "C", 
"C", "C", "C", "C", "C", "C"), V5 = c("T", "T", "G", "T", "G", 
"G", "G", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", 
"T", "T", "T", "T", "T", "T", "T", "T", "T"), V6 = c("G", "G", 
"C", "G", "C", "C", "C", "G", "G", "G", "G", "G", "G", "G", "G", 
"G", "G", "G", "G", "G", "G", "G", "G", "G", "G", "G", "G"), 
V7 = c("C", "C", "A", "C", "A", "A", "A", "C", "C", "C", 
"C", "C", "C", "C", "C", "C", "G", "G", "G", "G", "G", "G", 
"G", "G", "G", "G", "G"), V8 = c("T", "T", "A", "T", "A", 
"A", "A", "T", "T", "T", "T", "T", "T", "T", "T", "T", "T", 
"T", "T", "T", "T", "T", "T", "T", "T", "T", "T"), V9 = c("A", 
"A", "A", "A", "A", "T", "T", "A", "A", "A", "A", "A", "A", 
"A", "A", "A", "A", "T", "T", "T", "T", "T", "T", "T", "T", 
"T", "T")), class = "data.frame", row.names = c(NA, -27L))

谢谢!

您可能想要查看r中的%in%操作符。根据您的问题,您可能想要这样的内容:

m1[,1] %in% m2[,1]
#[1]  TRUE FALSE  TRUE  TRUE FALSE  TRUE  TRUE FALSE

然后您可以将其与meansum等函数配对,这将帮助您找到所需的百分比:

sum(m1[,1] %in% m2[,1])
#[1] 5
mean(m1[,1] %in% m2[,1])
#[1] 0.625

编辑:根据OP在这篇文章评论中的要求,有各种方法可以做到这一点,我个人最喜欢的是which函数:

m1[which(m1[,1] %in% m2[,1]),]
#[1] "Taxon1" "Taxon3" "Taxon4" "Taxon6" "Taxon7"
m1[which(!(m1[,1] %in% m2[,1])),]
#[1] "Taxon2" "Taxon5" "Taxon8"

同样,这里只有一个方法,在许多(我现在可以数3个…),所以我建议你探索其他选项…

要在两个数据框中获得通用名称,您可以使用intersect,要计算缺失百分比,您可以使用%in%mean

common_names <- intersect(m1$V1, m2$V1)
missing_percentage_in_m1 <- mean(!m1$V1 %in% m2$V1) * 100
missing_percentage_in_m2 <- mean(!m2$V1 %in% m1$V1) * 100
common_names
#[1] "Taxon1" "Taxon3" "Taxon4" "Taxon6" "Taxon7"
missing_percentage_in_m1
#[1] 37.5
missing_percentage_in_m2
#[1] 81.48148 

代码将得到如下结果

2
Tom
Megan
60%

1。m1中有多少名字在m2

中找到?
m1 <- t(m1)
res1 <-m2 %>%
rowwise %>%
mutate(n = m1 %in% c_across(V1:V9) %>% sum)
res1
# A tibble: 27 x 10
# Rowwise: 
V1      V2    V3    V4    V5    V6    V7    V8    V9        n
<chr>   <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr> <int>
1 Taxon1  A     G     C     T     G     C     T     A         1
2 Taxon3  A     G     C     T     G     C     T     A         1
3 Taxon4  A     G     C     G     C     A     A     A         1
4 Taxon6  A     G     C     T     G     C     T     A         1
5 Taxon7  A     G     C     G     C     A     A     A         1
6 Taxon9  A     C     T     G     C     A     A     T         0
7 Taxon10 A     C     G     G     C     A     A     T         0
8 Taxon11 A     G     C     T     G     C     T     A         0
9 Taxon12 A     G     C     T     G     C     T     A         0
10 Taxon13 A     G     C     T     G     C     T     A         0
# ... with 17 more rows
res1 %>% select(n) %>% sum
[1]  5
res2 <-res1 %>%
filter(n >0) %>%
pull(V1) %>%
unique
res2
[1] "Taxon1" "Taxon3" "Taxon4" "Taxon6" "Taxon7"

2。m2中缺少多少数据(以百分比表示)

res3 <- res2 %>% length
1 - res3 / length(unique(m2$V1))
[1] 0.8148148

最新更新