【问题标题】:error with tidyr::gather() when I have unique names当我有唯一名称时 tidyr::gather() 出错
【发布时间】:2017-09-17 07:23:49
【问题描述】:

我对 tidyr 包中的 gather() 函数有疑问。

sample
# A tibble: 5 × 6
  market_share      Y2012      Y2013      Y2014      Y2015      Y2016
         <chr>      <dbl>      <dbl>      <dbl>      <dbl>      <dbl>
1          KAB 0.23469425 0.23513725 0.23187590 0.22940831 0.22662625
2          BGD 0.21353096 0.21352769 0.20910574 0.20035900 0.19374223
3          NN 0.16891699 0.16204919 0.16272993 0.16388675 0.16154017
4         OG 0.07648682 0.07597078 0.07945966 0.07780233 0.08069057
5         Ha 0.05092648 0.05480555 0.06434457 0.07127716 0.08054208

如果我尝试:

sample2 <- gather(sample, market_share, period, Y2012:Y2016)
Error: Each variable must have a unique name.
Problem variables: 'market_share'

但是,每个变量似乎都有一个唯一的名称。

Ha  KAB  BGD  NN OG 
   1    1    1    1    1 

这似乎是人们对收集的常见问题,但我不明白。

【问题讨论】:

    标签: r tidyr


    【解决方案1】:

    查看您的数据时,您的数据似乎是一个tibble 对象(请参阅 tibble::tibble)。但是gather 需要一个data.frame。 尝试将您的对象更改为 data.frame:

    sample2 &lt;- gather(data.frame(sample),market_share, period, Y2012:Y2016)

    这应该可以解决您的问题。

    例子:

    library(tibble)
    sample <- read.table(text="market_share Y2012 Y2013 Y2014 Y2015 Y2016
    KAB 0.23469425 0.23513725 0.23187590 0.22940831 0.22662625
    BGD 0.21353096 0.21352769 0.20910574 0.20035900 0.19374223
    NN 0.16891699 0.16204919 0.16272993 0.16388675 0.16154017
    OG 0.07648682 0.07597078 0.07945966 0.07780233 0.08069057
    Ha 0.05092648 0.05480555 0.06434457 0.07127716 0.08054208",
    header=TRUE, stringsAsFactors=FALSE)  
    
    sample <- as_tibble(sample)  
    sample
    
    # A tibble: 5 x 6
      market_share      Y2012      Y2013      Y2014      Y2015      Y2016
             <chr>      <dbl>      <dbl>      <dbl>      <dbl>      <dbl>
    1          KAB 0.23469425 0.23513725 0.23187590 0.22940831 0.22662625
    2          BGD 0.21353096 0.21352769 0.20910574 0.20035900 0.19374223
    3           NN 0.16891699 0.16204919 0.16272993 0.16388675 0.16154017
    4           OG 0.07648682 0.07597078 0.07945966 0.07780233 0.08069057
    5           Ha 0.05092648 0.05480555 0.06434457 0.07127716 0.08054208
    
    sample2 <- gather(sample, period, result, Y2012:Y2016) # Does not work
    Error: Column 'market_share' must have a unique name
    

    这不起作用,但如果您将其更改为 data.frame ,它会起作用:

    sample2 <- sample2 <- gather(data.frame(sample), period, result, Y2012:Y2016) # works perfect`
    sample2
           market_share period     result
    1           KAB  Y2012 0.23469425
    2           BGD  Y2012 0.21353096
    3            NN  Y2012 0.16891699
    4            OG  Y2012 0.07648682
    5            Ha  Y2012 0.05092648
    6           KAB  Y2013 0.23513725
    ...
    

    【讨论】:

      【解决方案2】:

      第二个和第三个参数是要在输出中创建的键和值列的名称。有两个同名的列很奇怪,并且不能很好地与tidyrdplyr 的其他功能一起使用。我建议为新列提供其他名称。因此,您可以尝试:

      sample2 <- gather(sample, period, value, Y2012:Y2016)
      

      【讨论】:

      • 我明白了。我认为该错误在数据框的字段中挑选出重复的值。我没有想到我正在用功能复制名称。谢谢!
      【解决方案3】:

      错误消息告诉您正在尝试创建一个新列market_share,但它已经存在。您需要将period 放在第二个位置,因为这是您要创建的列。

      df1<-read.table(text="market_share      Y2012      Y2013      Y2014      Y2015      Y2016
      KAB 0.23469425 0.23513725 0.23187590 0.22940831 0.22662625
      BGD 0.21353096 0.21352769 0.20910574 0.20035900 0.19374223
      NN 0.16891699 0.16204919 0.16272993 0.16388675 0.16154017
      OG 0.07648682 0.07597078 0.07945966 0.07780233 0.08069057
      Ha 0.05092648 0.05480555 0.06434457 0.07127716 0.08054208",header=TRUE, stringsAsFactors=FALSE)
      
      library(tidyr)    
      gather(df1, period,market_share)
      
         market_share period market_share
      1           KAB  Y2012   0.23469425
      2           BGD  Y2012   0.21353096
      3            NN  Y2012   0.16891699
      4            OG  Y2012   0.07648682
      5            Ha  Y2012   0.05092648
      6           KAB  Y2013   0.23513725
      7           BGD  Y2013   0.21352769
      8            NN  Y2013   0.16204919
      9            OG  Y2013   0.07597078
      10           Ha  Y2013   0.05480555
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-06-08
        • 2017-03-06
        • 1970-01-01
        • 2018-06-24
        • 2015-10-11
        相关资源
        最近更新 更多