【问题标题】:Unstacking Data Frame By Columns in R在 R 中按列拆分数据帧
【发布时间】:2020-05-22 18:33:31
【问题描述】:

我想根据两列在R中解开一个数据框,即从

id   segment  count  freq
1    a        x1a    f1a
1    b        x1b    f1b
1    c        x1c    f1c
2    a        x2a    f2a
2    b        x2b    f2b
2    c        x2c    f2c

我想得到:

id   count_a  count_b count_c freq_a freq_b freq_c
1    x1a      x1b     x1c     f1a    f1b    f1c
2    x2a      x2b     x2c     f2a    f2b    f2c

基本上,这相当于将数据帧的前两列 id 和 segment 拆开。但是,我不知道如何使用 R 中的 unstack() 函数来使其工作。我可以使用非常天真的方法(嵌套 for 循环、连接列名等然后绑定)来做到这一点,但必须有一个更直接有效的方式。

【问题讨论】:

    标签: r


    【解决方案1】:

    我们可以使用pivot_wider

    library(dplyr)
    library(tidyr)
    df1 %>%       
       pivot_wider(names_from = c(segment), values_from = c(count, freq))
    # A tibble: 2 x 7
    #     id count_a count_b count_c freq_a freq_b freq_c
    #  <int> <chr>   <chr>   <chr>   <chr>  <chr>  <chr> 
    #1     1 x1a     x1b     x1c     f1a    f1b    f1c   
    #2     2 x2a     x2b     x2c     f2a    f2b    f2c   
    

    dcast

    library(data.table)
    dcast(setDT(df1), id ~ segment, value.var = c('count', 'freq'))
    #   id count_a count_b count_c freq_a freq_b freq_c
    #1:  1     x1a     x1b     x1c    f1a    f1b    f1c
    #2:  2     x2a     x2b     x2c    f2a    f2b    f2c
    

    更新

    如果有重复,则创建一个序列列

    df1 %>%
       mutate(rn = rowid(segment)) %>%
        pivot_wider(names_from = c(segment), values_from = c(count, freq)) %>%
       select(-rn)
    

    或者data.table

    dcast(setDT(df1), id + rowid(segment) ~ segment, 
           alue.var = c('count', 'freq'))[, segment := NULL][]
    

    数据

    df1 <- structure(list(id = c(1L, 1L, 1L, 2L, 2L, 2L), segment = c("a", 
    "b", "c", "a", "b", "c"), count = c("x1a", "x1b", "x1c", "x2a", 
    "x2b", "x2c"), freq = c("f1a", "f1b", "f1c", "f2a", "f2b", "f2c"
    )), class = "data.frame", row.names = c(NA, -6L))
    

    【讨论】:

    • 实际上,我只是注意到 dcast 示例为每个值分配了 0 或 1,所以出了点问题。例如,如果 x1a=12,则应用 dcast 后 xa1_segment = 1
    • 那个也给了我一个奇怪的结果。对于每个 id,我仍然有多个条目,但在某些行中有 NA 值。它适用于您使用结构函数指定的 df1,但不适用于我正在使用的数据框。 id 列的列表(而不是向量)的使用是否有特定的原因可能导致差异?
    • @Max 好的,这就是问题所在。如果您展示了一个重复的示例,那么它将是 beeter
    • 我将 df1 = read.csv() 用于我的 df1,然后我应用了您使用的确切语法(我假设我的 df1 的第一列不是列表) .当我应用 dcast 语法时,我收到一条警告,指出“缺少聚合函数,默认为长度”。生成的数据表将所有值替换为 0 或 1。我对 dcast 不够熟悉,无法理解警告消息的含义,但我认为它解释了为什么我会得到这个奇怪的结果。
    • @Max 如果您使用的是 uupdated 版本,那么它应该已经消失了
    猜你喜欢
    • 1970-01-01
    • 2023-03-31
    • 1970-01-01
    • 2020-12-14
    • 2020-01-18
    • 1970-01-01
    • 2018-01-22
    • 2016-06-27
    • 1970-01-01
    相关资源
    最近更新 更多