【问题标题】:Converting a matrix into a data frame in a long format (R)将矩阵转换为长格式 (R) 的数据帧
【发布时间】:2020-02-19 20:49:17
【问题描述】:

我有一个这种格式的矩阵:

Example_matrix<- structure(list(X1 = c("Species 1", "Species 2", "Species 3", 
"Species 4", "Species 5", "Species 6", "Species 7", "Species 8"
), `Site 1` = c(0, 0, 0, 2, 2, 0, 0, 5), `Site 2` = c(0, 0, 0, 
4, 0, 0, 0, 0), `Site 3` = c(0, 1, 0, 0, 0, 1, 0, 0), `Site 4` = c(0, 
0, 0, 0, 0, 1, 0, 0)), class = c("spec_tbl_df", "tbl_df", "tbl", 
"data.frame"), row.names = c(NA, -8L), spec = structure(list(
    cols = list(X1 = structure(list(), class = c("collector_character", 
    "collector")), `Site 1` = structure(list(), class = c("collector_double", 
    "collector")), `Site 2` = structure(list(), class = c("collector_double", 
    "collector")), `Site 3` = structure(list(), class = c("collector_double", 
    "collector")), `Site 4` = structure(list(), class = c("collector_double", 
    "collector"))), default = structure(list(), class = c("collector_guess", 
    "collector")), skip = 1), class = "col_spec"))

(这是它的简化版)

有没有办法快速将这样的矩阵转换为长格式的df?我看了一些类似的问题,但这些选项对我不起作用。我想要做的就是最终得到一个包含 3 列的 df:Site、Species 和 Abundance(当前是矩阵中每个单元格中的值)。

谢谢!

【问题讨论】:

  • 你需要Example_matrix %&gt;% pivot_longer(cols = starts_with('Site'), names_to = 'Site', values_to = 'Abundance')

标签: r dataframe matrix format


【解决方案1】:

也许您可以使用reshape 尝试以下基本 R 方法

dflong <- `rownames<-`(setNames(reshape(Example_matrix,
                                        direction = "long",
                                        v.names = "Site",
                                        idvar = "X1",
                                        times = names(Example_matrix[-1]),
                                        varying = list(names(Example_matrix[-1]))), 
                                c("X1","Site","Abundance")),
                       NULL)

这样

> dflong
          X1   Site Abundance
1  Species 1 Site 1         0
2  Species 2 Site 1         0
3  Species 3 Site 1         0
4  Species 4 Site 1         2
5  Species 5 Site 1         2
6  Species 6 Site 1         0
7  Species 7 Site 1         0
8  Species 8 Site 1         5
9  Species 1 Site 2         0
10 Species 2 Site 2         0
11 Species 3 Site 2         0
12 Species 4 Site 2         4
13 Species 5 Site 2         0
14 Species 6 Site 2         0
15 Species 7 Site 2         0
16 Species 8 Site 2         0
17 Species 1 Site 3         0
18 Species 2 Site 3         1
19 Species 3 Site 3         0
20 Species 4 Site 3         0
21 Species 5 Site 3         0
22 Species 6 Site 3         1
23 Species 7 Site 3         0
24 Species 8 Site 3         0
25 Species 1 Site 4         0
26 Species 2 Site 4         0
27 Species 3 Site 4         0
28 Species 4 Site 4         0
29 Species 5 Site 4         0
30 Species 6 Site 4         1
31 Species 7 Site 4         0
32 Species 8 Site 4         0

【讨论】:

    【解决方案2】:

    我们可以使用来自tidyrpivot_longer

    library(dplyr)
    library(tidyr)
    newdat <- Example_matrix %>% 
        pivot_longer(cols = starts_with('Site'),
              names_to = 'Site', values_to = 'Abundance')
    
    newdat
    # A tibble: 32 x 3
    #   X1        Site   Abundance
    #   <chr>     <chr>      <dbl>
    # 1 Species 1 Site 1         0
    # 2 Species 1 Site 2         0
    # 3 Species 1 Site 3         0
    # 4 Species 1 Site 4         0
    # 5 Species 2 Site 1         0
    # 6 Species 2 Site 2         0
    # 7 Species 2 Site 3         1
    # 8 Species 2 Site 4         0
    # 9 Species 3 Site 1         0
    #10 Species 3 Site 2         0
    # … with 22 more rows
    

    base R,我们可以做

    as.data.frame.table(`row.names<-`(as.matrix(Example_matrix)[,-1],
           Example_matrix$X1))
    

    【讨论】:

    • 谢谢!我有一个非常奇怪的错误。所以我的完整数据矩阵的格式完全相同,只是有更多的物种和更多的站点。但我得到这个“错误:cols 必须选择至少一列”。知道这可能意味着什么吗?
    • 对不起,我没有提到 - 这是 tidyr 的。基本 R 代码适用于我的示例和实际矩阵
    • @KarolinaZarzyczny 可能是版本差异。你能显示你的包版本dplyrtidyr
    • 有可能!没关系,谢谢。我已经设法用 base r 选项做到了,所以我不想占用你更多的时间! :) 感谢您的帮助!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-07-21
    • 1970-01-01
    • 1970-01-01
    • 2019-04-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多