在R

时间:2018-09-18 19:05:46

标签: r windows

我正在尝试创建数据透视表,并且在获取输出时遇到了一些问题。我与软件包无关,我尝试过reshape2,tidry和dplyr,但没有任何工作。

到目前为止,我的尝试全部出错,我还设法收集了数据以将“填充”和“目标”移到名为“ Type”的新变量中,值是“ Seats ...”,但似乎没有可以帮助。

mynewdf = gather(mydf,Type,Seats,c("Fill","Target"))

我认为接近工作的代码.....

t=dcast(mydf, Date + Type + Month ~ Seats, length, drop=FALSE)

我当前的数据结构如下:

Date Month Fill Target Code
1234  Jan  14    15    13B
1234  Feb  12    14    13B
.................
1235  Oct  13    16    13F

绝不应该有重复的日期/月份/代码,我最终要显示的是“填充”和“目标”(最终进行一些计算所得的字段,但我稍后会越过该桥)。

我希望输出为:

        Jan             Feb        .......   Oct .....    
Date Fill  Target  Fill  Target    ....... Fill Target.... MOS
1234  14    15     12     14       ....................... 13B
1235  ......................................13   16  ..... 13F

我尝试按月和填充分组,然后按月和目标分组,但是没有运气。

1 个答案:

答案 0 :(得分:0)

答案比我想要的更为冗长,但这应该可以帮助您开始。

首先输入显示的数据框:

library(dplyr); library(tidyr)

mydf <- data.frame(Date = c(1234, 1234, 1235),
                   Month = c('Jan', 'Feb', 'Oct'),
                   Fill = c(14, 12, 13),
                   Target = c(15, 14, 16),
                   Code = c('13B', '13B', '13F'))

然后用tidyr::unite()处理起始数据:

> newdf <- mydf %>% 
+     tidyr::unite(Fill_Target, Fill, Target, sep='_')
> newdf
  Date Month Fill_Target Code
1 1234   Jan       14_15  13B
2 1234   Feb       12_14  13B
3 1235   Oct       13_16  13F

因此,您要将Fill和Target变量合并到一个列中。为此,您可以使用tidyr::spread

> newdf <- newdf %>% tidyr::spread(Month, Fill_Target)
> newdf
  Date Code   Feb   Jan   Oct
1 1234  13B 12_14 14_15  <NA>
2 1235  13F  <NA>  <NA> 13_16

因此,这里有日期和代码,然后是月,其后是Fill_Target值。然后使用tidyr::separate()将它们分成单独的列:

> newdf <- newdf %>% 
+     tidyr::separate(Jan, into = c('Jan_Fill', 'Jan_Target')) %>% 
+     tidyr::separate(Feb, into = c('Feb_Fill', 'Feb_Target')) %>% 
+     tidyr::separate(Oct, into = c('Oct_Fill', 'Oct_Target'))
> newdf
  Date Code Feb_Fill Feb_Target Jan_Fill Jan_Target Oct_Fill Oct_Target
1 1234  13B       12         14       14         15     <NA>       <NA>
2 1235  13F     <NA>       <NA>     <NA>       <NA>       13         16

然后您可以使用dplyr::select()对列进行重新排序

> newdf %>% 
+   select(Date, Jan_Fill, Jan_Target, Feb_Fill, Feb_Target, Oct_Fill, Oct_Target, 
+          Code)
  Date Jan_Fill Jan_Target Feb_Fill Feb_Target Oct_Fill Oct_Target Code
1 1234       14         15       12         14     <NA>       <NA>  13B
2 1235     <NA>       <NA>     <NA>       <NA>       13         16  13F

现在,我不喜欢这个答案,因为它有点冗长,尤其是当您考虑要有12个月的时间时。但是,对于您来说,在代码中稍微冗长和刻意而不是弄乱准引用并尝试以一种更好的方式分隔和选择月份可能会更容易/更好。

此外,我注意到只有两行“标题”,而不是您的两行。不幸的是,如果您想要第二行标题,则必须使用Python Pandas。 R不支持这一点。