在R中如何将矩阵的行名和列名与 Dataframe 中的列匹配?

wljmcqd8  于 2022-12-25  发布在  其他
关注(0)|答案(1)|浏览(112)

我有一个文本文件,其中有一个名为ID的列,该列的值为A B C

variant_id gene tss_distance ma_samples ma_count  ID      
1  chr1 ENSG      80       68       78    A
2  chr1 ENSG      80       395      486   B
3  chr1 ENSG      80       167      183   C

我有一个正方形矩阵,所以有5000 x 5000。行名称=列名称。(我的矩阵列和行名称匹配)。行名称和列名称还匹配 Dataframe ID列中的一些ID。矩阵可能包含 Dataframe 中未找到的额外ID。

[A][B][C][D]  
[A] value1 value2 value3 value4
[B] value5 value6 value7 value8 
[C] value9 value10 value11 value12
[D] value13 value14 value15 value16

我希望矩阵的行名称和列名称与 Dataframe 中的ID列完全匹配。
矩阵应为(例如):请注意,由于D在 Dataframe 中丢失,因此D不显示。

[A][B][C]  
[A] value1 value2 value3 value4
[B] value9 value10 value11 value12
[C] value13 value14 value15 value16

使用下面的命令的问题是它只过滤行,我需要删除列和行,如果在 Dataframe 中没有找到,所以矩阵仍然是一个正方形。最终矩阵的行名称和列名应该完全匹配 Dataframe 中的ID列。

matrix <- matrix[row.names(matrix)%in%dataframe$ID,]

行名称必须等于矩阵的列名称,因此必须为正方形。这必须为真:

identical(rownames(matrix),colnames(matrix))
2jcobegt

2jcobegt1#

使用match两次。

df1 <- data.frame(ID = LETTERS[1:3])
mat <- matrix(1:16, ncol = 4, dimnames = list(LETTERS[1:4], LETTERS[1:4]))

i_row <- match(df1$ID, rownames(mat))
i_col <- match(df1$ID, colnames(mat))
mat[i_row, i_col]
#>   A B  C
#> A 1 5  9
#> B 2 6 10
#> C 3 7 11

创建于2022年12月20日,使用reprex v2.0.2

编辑

如果df1$ID中没有列名和行名,则intersect是一个解决方案。

i_row <- intersect(df1$ID, rownames(mat))
i_col <- intersect(df1$ID, colnames(mat))
mat[i_row, i_col]
#>   A B  C
#> A 1 5  9
#> B 2 6 10
#> C 3 7 11

创建于2022年12月21日,使用reprex v2.0.2

相关问题