【问题标题】:Gather a tibble with matrix columns用矩阵列收集一个小标题
【发布时间】:2020-02-13 02:36:11
【问题描述】:

我的小标题是这样的:

df = tibble(x = 1:3, col1 = matrix(rnorm(6), ncol = 2), 
                col2 = matrix(rnorm(6), ncol = 2))

它有三列,其中两列包含一个矩阵,每列有 2 列(在我的例子中还有更多列,这个例子只是为了说明问题)。我使用收集将此数据转换为长格式

gather(df, key, val, -x)

但这并没有给我想要的结果。它仅堆叠第 1 列和第 2 列的第一列,并忽略其余部分。我想要的是 val 包含第 1 列和第 2 列的行向量,即 val 是矩阵值列(包含 1x2 矩阵)。然而,tidyverse 似乎无法正确处理矩阵值列。有没有办法达到我想要的结果? (最好使用 tidyverse 中的例程)

【问题讨论】:

    标签: r dplyr tidyr purrr


    【解决方案1】:

    一些列是matrix。它需要转换为适当的 data.frame 列,然后才能工作

    library(dplyr)
    library(tidyr) 
    do.call(data.frame, df) %>%
           pivot_longer(cols = -x)
    

    或使用gather

    do.call(data.frame, df) %>%
           gather(key, val, -x)
    

    或者另一种选择是使用cmatrix 转换为vector,然后使用unnest

    df %>%
         mutate_at(-1,   ~ list(c(.))) %>%
         unnest(c(col1, col2))
    

    如果 'col1', 'col2', 值将在单个列中

    df %>%
        mutate_at(-1,   ~ list(c(.))) %>%
        pivot_longer(cols = -x) %>% 
        unnest(c(value))
    

    【讨论】:

    • 完美! do.call(tibble, df) %>% pivot_longer(cols = -x) 正是我想要的!谢谢。
    猜你喜欢
    • 1970-01-01
    • 2018-01-03
    • 2017-02-08
    • 1970-01-01
    • 1970-01-01
    • 2014-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多