如何将双精度矩阵转换为 DataFrame 列

how to transform double matrix into dataframe columns

提问人:Marine Bergot 提问时间:11/3/2023 最后编辑:ThomasIsCodingMarine Bergot 更新时间:11/3/2023 访问量:52

问:

我正在尝试将一些方形双精度矩阵重塑为一些列数据帧

像这样:

                genomeA    genomeB    genomeC
       genomeA    1.0        0.5       0.3
       genomeB    0.5        1.0       0.2
       genomeC    0.3        0.2       1.0

Genomes1   Genomes2    Value
genomeA    genomeA     1.0
genomeA    genomeB     0.5
genomeA    genomeC     0.3
 .....

我试图将其转换为数据帧,但它没有做任何事情 我尝试了 Tibble

    df <- corr %>%
  as_tibble() %>%
  setNames(c('GenomesA', 'GenomesB', 'AAI'))

它创造了一些奇怪的矩阵,但不是我想要的

如果有人作为我的线索!谢谢

r 重塑

评论


答:

1赞 Ronak Shah 11/3/2023 #1

您可以尝试以下方法:

library(tidyverse)

corr %>%
  as.data.frame() %>%
  rownames_to_column(var = "Genomes1") %>%
  pivot_longer(cols = -Genomes1, names_to = "Genomes2")

#  Genomes1 Genomes2   value
#  <chr>    <chr>      <dbl>
#1 genomeA  genomeA  -1.00  
#2 genomeA  genomeB  -1.32  
#3 genomeA  genomeC   0.254 
#4 genomeB  genomeA   0.0600
#5 genomeB  genomeB  -0.0602
#6 genomeB  genomeC  -0.594 
#7 genomeC  genomeA  -1.65  
#8 genomeC  genomeB  -0.530 
#9 genomeC  genomeC  -0.390 

示例数据

corr <- structure(c(-1.00308806318708, 0.0600357248405599, -1.65288400581753, 
-1.31933414605029, -0.0601936388016965, -0.529547763994527, 0.253656662526024, 
-0.594415786654097, -0.390061373503094), dim = c(3L, 3L), dimnames = list(
    c("genomeA", "genomeB", "genomeC"), c("genomeA", "genomeB", 
    "genomeC")))
3赞 Maël 11/3/2023 #2

可以使用(在 R 4.3.0 中引入):array2DF

array2DF(m)

但这会产生意想不到的后果,即输出不正确的第二列;您可以像这样补救:

array2DF(m, responseName = "AAI", simplify = FALSE) |>
  transform(AAI = mapply(\(x, y) x[y], AAI, match(Var2, unique(Var2))))

#      Var1    Var2 AAI
# 1 genomeA genomeA 1.0
# 2 genomeB genomeA 0.5
# 3 genomeC genomeA 0.3
# 4 genomeA genomeB 0.5
# 5 genomeB genomeB 1.0
# 6 genomeC genomeB 0.2
# 7 genomeA genomeC 0.3
# 8 genomeB genomeC 0.2
# 9 genomeC genomeC 1.0

数据

m <- read.table(h=T,text="         genomeA    genomeB    genomeC
       genomeA    1.0        0.5       0.3
       genomeB    0.5        1.0       0.2
       genomeC    0.3        0.2       1.0")

评论

2赞 ThomasIsCoding 11/3/2023
array2DF让事情变得如此简单,酷炫!我落后于最新的 R 版本:P
1赞 ThomasIsCoding 11/3/2023
在 R 版本 4.3.0 <中,我认为传统方式可能是as.data.frame.table(as.matrix(m))
1赞 Marine Bergot 11/3/2023
太棒了,非常感谢!效果真好!Tidyverse 答案也有效,但输出对 ggplot2 不利,但有了您的解决方案,它就完美了,谢谢!