【问题标题】:How to return values from group_by in R dplyr?如何从 R dplyr 中的 group_by 返回值?
【发布时间】:2017-03-31 08:17:24
【问题描述】:

早上好,

我有一个两列数据集,我想根据 Dplyr 中的 group_by 将其扩展到更多列,但我不确定如何。

我的数据如下:

Person     Case
John       A
John       B
Bill       C
David      F

我希望能够将其转换为以下结构:

Person  Case_1  Case_2 ... Case_n
John    A       B
Bill    C       NA
David   F       NA

我最初的想法是这样的:

data %>%
  group_by(Person) %>%
  spread()

Error: Please supply column name

实现这一目标的最简单或最类似于 R 的方法是什么?

【问题讨论】:

    标签: r dplyr


    【解决方案1】:

    您应该首先向数据集添加一个案例 id,这可以通过 group_bymutate 的组合来完成:

    dat = data.frame(Person = c('John', 'John', 'Bill', 'David'), Case = c('A', 'B', 'C', 'F'))
    dat = dat %>% group_by(Person) %>% mutate(id = sprintf('Case_%d', row_number()))
    dat %>% head()
    # A tibble: 4 × 3
      Person   Case     id
      <fctr> <fctr>  <chr>
    1   John      A Case_1
    2   John      B Case_2
    3   Bill      C Case_1
    4  David      F Case_1
    

    现在您可以使用spread 来转换数据:

    dat %>% spread(Person, Case)
    # A tibble: 2 × 4
          id   Bill  David   John
    *  <chr> <fctr> <fctr> <fctr>
    1 Case_1      C      F      A
    2 Case_2     NA     NA      B
    

    您可以使用以下方法获得上面列出的结构:

    res = dat %>% spread(Person, Case) %>% select(-id) %>% t() %>% as.data.frame()
    names(res) = unique(dat$id)
    res
          Case_1 Case_2
    Bill       C   <NA>
    David      F   <NA>
    John       A      B
    

    【讨论】:

    • 不需要ungroup,并且可以使用内置函数更轻松地进行更改:mutate(ID = row_number())
    • 非常有帮助的答案,保罗。我在 Pandas 中学到了大部分的争论,但我一生都无法弄清楚如何在 R 中做同样的事情。现在也知道 t() 函数。
    • @KonradRudolph 我担心传播会遵守group_by,但没有测试过。我也不知道row_number。在 hadleyverse 中总是有新的东西要学习。我更新了我的答案。
    • @elksie5000 没问题!熊猫真的很酷:)。也许看看dplyr tutorial I wrote 以了解dplyr 的大致概念。
    • 如果你做spread(Case, Person),之后还需要转置数据框吗?
    猜你喜欢
    • 1970-01-01
    • 2021-04-17
    • 2017-03-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-07
    • 1970-01-01
    • 2022-01-15
    • 1970-01-01
    相关资源
    最近更新 更多