将因子变量数据显示到表中

时间:2018-04-17 08:19:02

标签: r dplyr data.table plyr

这是50万行的小sampleData,这里的product,date和salesamount是一个因子变量。 我需要将数据除以2011年和2012年,并显示该产品及其当年销售额的总和。 我终于尝试了很多,我使用数据透视表在excel中做到了。 但我想知道如何在R中实现这一点,因为我不想要更多excel文件。 谢谢你

 product    date       salesamount
   a       2011-01          35
   b       2011-02          40
   c       2011-03          50
   d       2011-01          55
   b       2012-02          46
   a       2011-02          35
   d       2012-01          62
   c       2012-03          56
   c       2012-02          56
   a       2012-03          38
   b       2012-01          46
   e       2011-03          60
   a       2012-03          38
   e       2012-02          67
   d       2011-01          55

将数据除以年后数据应该是这样的

 product   year2011    year2012
   a         70         76
   b         40         92
   c         50         112
   d         110        62
   e         60         67

3 个答案:

答案 0 :(得分:2)

  1. 创建年份变量。
  2. Group and sum
  3. Reshape long to wide.
  4. library(dplyr)
    library(tidyr)
    
    df %>% 
      separate(date, c('year', 'month')) %>% 
      group_by(product, year) %>% 
      summarise(salesamount = sum(salesamount)) %>% 
      spread(year, salesamount, sep = '')
    
    # A tibble: 5 x 3
    # Groups:   product [5]
      product year2011 year2012
      <chr>      <int>    <int>
    1 a             70       76
    2 b             40       92
    3 c             50      112
    4 d            110       62
    5 e             60       67
    

答案 1 :(得分:1)

以下是awk '/^{/ {n++} n {print} n&&/^}/ {exit}' 的解决方案:

data.table

数据:

library("data.table")
DT[, year:=substr(date, 1, 4)]
dcast(DT, product ~ year, value.var="salesamount", fun.aggregate = sum)
# > dcast(DT, product ~ year, value.var="salesamount", fun.aggregate = sum)
#    product 2011 2012
# 1:       a   70   76
# 2:       b   40   92
# 3:       c   50  112
# 4:       d  110   62
# 5:       e   60   67

答案 2 :(得分:0)

假设dat对象为dat,则基本tapply方法为:

with( dat, tapply( salesamount, list( product, substring(date, 1,4) ), sum) )
  2011 2012
a   70   76
b   40   92
c   50  112
d  110   62
e   60   67