【问题标题】:gather and spread function in RR中的收集和传播函数
【发布时间】:2016-11-17 15:01:00
【问题描述】:

我使用以下代码创建了一个数据框:

stocks <- data.frame(time = as.Date('2009-01-01') + 0:9,
                   X = rnorm(50, 20, 1),
                    Y= rnorm(50, 20, 2),= rnorm(50, 20, 2),   
                   Z=rnorm(50,20,4))
)

我已将收集功能应用到数据框中:

res<-stocks%<%gather(company, value,-time)

在尝试传播资源时出现错误:

spread(data=res, key=company , value = value)    

Error: Duplicate identifiers for rows 

【问题讨论】:

  • 你有一列没有名字=rnorm(50,20,2)
  • 并且代码没有运行,因为它包含语法错误。
  • 您需要一个序列列,即stocks%&gt;%gather(company, value,-time) %&gt;% group_by(company) %&gt;% mutate(i = row_number()) %&gt;% spread(company, value) 它可以是companytime 中的group_by。由于没有预期的输出,所以不确定
  • @akrun 我更喜欢同时使用companytime,因为它可以索引特定公司和时间的观察结果。结果无所谓,但索引更有意义。

标签: r tidyverse


【解决方案1】:

我们需要一个序列列来避免错误Duplicate identifiers...

 stocks %>%
     gather(company, value,-time) %>%
     group_by(company) %>% 
     mutate(i = row_number()) %>% 
     spread(company, value)

【讨论】:

    【解决方案2】:

    给定以下数据:

    stocks <- data.frame(time = as.Date('2009-01-01') + 0:9,
                         X    = rnorm(50, 20, 1),
                         Y    = rnorm(50, 20, 2),
                         Z    = rnorm(50, 20, 2))
    

    我像你一样应用gather 并在结果上运行spread

    stocks %>% gather(company, value, -time) %>% spread(company, value)
    Error: Duplicate identifiers for rows (1, 11, 21, 31, 41), (2, 12, 22,
    

    当我们查看行时c(1, 11, 21, etc)

             time company    value
    1  2009-01-01       X 20.69259
    11 2009-01-01       X 20.50856
    21 2009-01-01       X 17.83796
    

    我们看到timecompany 列包含相同的内容,即公司X 在该日期有多个观察值。这会导致您看到的错误,因为 spread 无法一致地聚合。

    您可以通过添加一个附加列来为每个日期和公司的值编制索引来解决此问题:

    res = stocks %>% gather(company, value, -time) %>% 
                     group_by(company, time) %>% 
                     mutate(i = row_number()) %>% 
                     spread(company, value)
    

    再检查一下我们有stocks

    all.equal(stocks %>% arrange(time), res %>% select(-i) %>% as.data.frame())
    [1] TRUE
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-24
      • 1970-01-01
      相关资源
      最近更新 更多