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

Posted

技术标签:

【中文标题】如何识别两个数据矩阵之间的哪些列和行匹配?【英文标题】:How would I identify which columns and rows match between two data matrices? 【发布时间】:2021-10-29 17:26:42 【问题描述】:

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

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

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

我想检查在 m2 中找到了多少(以及哪些)m1 行(这意味着它将在 0 到 44 之间的任意位置)。最终目标是我有 4000 个不同的矩阵可以代替 m2 的位置,我需要查看所有 m2 中缺失条目(在 m1 中找到)的程度(即,我正在查看缺失数据的程度这 44 个名字中的一个)。

我仍然是 R 的初学者,如果我的描述有点不妥,敬请见谅。

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

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

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

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

例如: 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(),请告诉我): 米1:

structure(list(V1 = c("Taxon1", "Taxon2", "Taxon3", "Taxon4", 
"Taxon5", "Taxon6", "Taxon7", "Taxon8")), class = "data.frame", row.names = c(NA, 
-8L))

平方米:

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))

谢谢!

【问题讨论】:

请澄清您的具体问题或提供其他详细信息以准确突出您的需求。正如目前所写的那样,很难准确地说出你在问什么。 我刚刚添加了更多信息;这足以帮助澄清我的要求吗?如果这还不够,我深表歉意。我会添加更多!我正在使用 Rstudio 和 R v4.0.2 @Justin 使用dput() 提供您的数据框样本。 @Shibaprasadb 我做对了吗?这是我第一次使用dput() 是的!现在好了。 【参考方案1】:

您可能想看看 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

编辑:根据本文 cmets 中 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 个...),所以我建议您探索其他选项...

【讨论】:

这很好用!有没有办法可以识别哪些标签存在,哪些标签缺失?因此,在此示例中,m2 中:存在 Taxon1、Taxon3、Taxon4、Taxon6 和 Taxon7。缺少 Taxon2、Taxon5 和 Taxon8【参考方案2】:

要在两个数据框中获取通用名称,您可以使用 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 

【讨论】:

【参考方案3】:

这段代码会得到这样的结果

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

【讨论】:

当我这样做时,res1 %&gt;% select(n) %&gt;% sum 得到我 [1] 0. 知道为什么吗? @Justin 真的很抱歉。前面忘记m1 &lt;- t(m1)了... 完全没问题,非常感谢!它工作:)

以上是关于如何识别两个数据矩阵之间的哪些列和行匹配?的主要内容,如果未能解决你的问题,请参考以下文章

当列和行与平面文件不匹配时,如何解决(使用)ETL

如何对数据框中某些列和行的数据求和?

如何在列和行之间的数据框中添加数据?

重新排序矩阵元素以反映朴素python中的列和行聚类

以编程方式查找,更正具有不同列和行长度的数据帧中的ID

如何对网格/矩阵/表格的两个标题进行列过滤(excel样式)