我如何确定两个数据矩阵之间匹配的列和行?
How would I identify which columns and rows match between two data matrices?
我有两个不同维度的数据矩阵作为对象存储在 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
`
平方米=
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))
平方米:
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
然后您可以将它与 mean
或 sum
等函数配对,这将帮助您找到所需的百分比:
sum(m1[,1] %in% m2[,1])
#[1] 5
mean(m1[,1] %in% m2[,1])
#[1] 0.625
编辑:根据 OP 在 post 的评论中的要求,有多种方法,我个人最喜欢的是 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.how 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.how m2 中丢失了很多数据(百分比)
res3 <- res2 %>% length
1 - res3 / length(unique(m2$V1))
[1] 0.8148148
我有两个不同维度的数据矩阵作为对象存储在 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
`
平方米=
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))
平方米:
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
然后您可以将它与 mean
或 sum
等函数配对,这将帮助您找到所需的百分比:
sum(m1[,1] %in% m2[,1])
#[1] 5
mean(m1[,1] %in% m2[,1])
#[1] 0.625
编辑:根据 OP 在 post 的评论中的要求,有多种方法,我个人最喜欢的是 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.how 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.how m2 中丢失了很多数据(百分比)
res3 <- res2 %>% length
1 - res3 / length(unique(m2$V1))
[1] 0.8148148