当我有唯一的名字时,tidyr :: gather()会出错

时间:2017-04-20 15:04:29

标签: r tidyr

我的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 

这似乎是人们聚集的常见问题,但我无法得到它。

3 个答案:

答案 0 :(得分:6)

第二个和第三个参数是要在输出中创建的键和值列的名称。具有相同名称的两列是奇数,并且与tidyrdplyr的其他函数不兼容。我建议为新列提供其他名称。因此,您可以尝试:

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

答案 1 :(得分:2)

错误消息告诉您正在尝试创建新列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

答案 2 :(得分:0)

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

sample2 <- 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
...
相关问题