在R中将矩阵转换为tibble

3

我该如何转换这个矩阵:

> matrix(1:3, nrow = 3, dimnames = list(c("X","Y","Z"), c("A")))
  A
X 1
Y 2
Z 3

转化为这个数据框:
> tibble::tribble(~group1, ~group2, ~value, "X", "A", 1, "Y", "A", 2, "Z", "A", 3)
# A tibble: 3 × 3
  group1 group2 value
  <chr>  <chr>  <dbl>
1 X      A          1
2 Y      A          2
3 Z      A          3

谢谢你

6个回答

4
更容易使用 base R,如果我们将其转换为 table 并使用 as.data.frame 进行强制转换(如果需要转换为 tibble - 使用 as_tibble 作为 as.data.frame 的包装器)。
as.data.frame(as.table(m1))
  Var1 Var2 Freq
1    X    A    1
2    Y    A    2
3    Z    A    3

数据

m1 <- matrix(1:3, nrow = 3, dimnames = list(c("X","Y","Z"), c("A")))

2

as.tibble可以将矩阵的rownames转换为一列,然后您可以使用gather()创建group2列:

library(tidyverse)

m <- matrix(1:3, nrow = 3, dimnames = list(c("X","Y","Z"), c("A")))

newtib <- m %>%
    as.tibble(rownames = "group1") %>%
    gather('A', key = "group2", value = "value")

> newtib
# A tibble: 3 × 3
  group1 group2 value
  <chr>  <chr>  <int>
1 X      A          1
2 Y      A          2
3 Z      A          3

> tibble::tribble(~group1, ~group2, ~value, "X", "A", 1, "Y", "A", 2, "Z", "A", 3)
# A tibble: 3 × 3
  group1 group2 value
  <chr>  <chr>  <dbl>
1 X      A          1
2 Y      A          2
3 Z      A          3

1

你可以使用 -

library(tidyverse)

mat <- matrix(1:3, nrow = 3, dimnames = list(c("X","Y","Z"), c("A")))

mat  %>%
  as.data.frame() %>%
  rownames_to_column(var = 'group1') %>%
  pivot_longer(cols = -group1, names_to = 'group2')

#  group1 group2 value
#  <chr>  <chr>  <dbl>
#1 X      A          1
#2 Y      A          2
#3 Z      A          3

1
  1. 将您的矩阵转换为数据框
  2. 将行名称带到列 group1
  3. 变异 group2
data.frame(matrix) %>% 
  rownames_to_column("group1") %>% 
  mutate(group2 = colnames(matrix)) %>% 
  dplyr::select(group1, group2, value=A)

  group1 group2 value
1      X      A     1
2      Y      A     2
3      Z      A     3

1
我会选择
m <- matrix(1:3, nrow = 3, dimnames = list(c("X","Y","Z"), c("A")))
tibble(
    group1 = rownames(m)[row(m)]
    ,group2 = colnames(m)[col(m)]
    ,value = c(m)
)

哪一个:

  • 适用于多列的情况
  • 在大矩阵上运行速度较快
  • 非常简单

0
你还有两个基本的 R 选项。
> as.data.frame.table(mat)
  Var1 Var2 Freq
1    X    A    1
2    Y    A    2
3    Z    A    3

或者

> cbind(expand.grid(dimnames(mat)), mat)
  Var1 Var2 A
X    X    A 1
Y    Y    A 2
Z    Z    A 3

数据

mat <- matrix(1:3, nrow = 3, dimnames = list(c("X", "Y", "Z"), c("A")))

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接