使用聚合来促进计算

时间:2016-10-03 23:36:18

标签: r aggregate large-data

所以最近我一直在学习聚合的功能,我发现它对我使用的大型数据集非常有用。通常我手动操作excel中的数据,虽然有效但非常耗时。

所以我想知道是否可以做到以下几点。我有一个类似结构的数据集(但更大):

Fruit    Crate   Mass
Apple    A       4
Banana   A       3.4
Orange   B       2
Apple    C       2.1
Apple    C       4.5
Banana   C       5
Orange   D       1
Apple    D       1.3
Orange   D       2.4
Orange   D       3.2
Orange   E       2
Banana   E       1.1
Banana   E       0.7
Apple    E       2

现在我知道这个我得到每箱的质量:

TotalCrate<-aggregate(data$Mass,list(crate=data$Crate), sum)

有了这个,我得到每箱每个水果的质量:

FruitperCrate<-aggregate(data$Mass, list(fruit=data$Fruit, crate=data$Crate), sum)

现在有一种方法可以获得每箱的水果质量百分比,所以基本上,有没有办法可以将果实质量除以每个箱子的总质量?如果是这样,我该怎么做以备将来参考。

感谢任何帮助。

谢谢

2 个答案:

答案 0 :(得分:3)

1)首先按FruitCrate进行汇总,然后将aveprop.table一起使用,以获得每个水果在其包装箱中的比例:

ag <- aggregate(Mass ~ Fruit + Crate, data, sum)
tr <- transform(ag, percent = 100 * ave(Mass, Crate, FUN = prop.table))

,并提供:

> tr
    Fruit Crate Mass   percent
1   Apple     A  4.0  54.05405
2  Banana     A  3.4  45.94595
3  Orange     B  2.0 100.00000
4   Apple     C  6.6  56.89655
5  Banana     C  5.0  43.10345
6   Apple     D  1.3  16.45570
7  Orange     D  6.6  83.54430
8   Apple     E  2.0  34.48276
9  Banana     E  1.8  31.03448
10 Orange     E  2.0  34.48276

或图形化:

library(ggplot2)
ggplot(tr, aes(Crate, percent, fill = Fruit)) + 
   geom_bar(stat = "identity") + 
   scale_fill_manual(values = c("red", "yellow", "orange"))

screenshot

1a)这也可以在像这样的magrittr管道中表达:

library(magrittr)
data %>%
     do(aggregate(Mass ~ Fruit + Crate, ., sum)) %>%
     transform(percent = 100 * ave(Mass, Crate, FUN = prop.table))

2),这是使用dplyr的替代方案,遵循类似的逻辑:

library(dplyr)
data %>% 
   group_by(Crate, Fruit) %>%
   summarize(Mass = sum(Mass)) %>%
   ungroup() %>%
   group_by(Crate) %>%
   mutate(percent = 100 * prop.table(Mass)) %>%
   ungroup()

,并提供:

# A tibble: 10 x 4
    Crate  Fruit  Mass   percent
   <fctr> <fctr> <dbl>     <dbl>
1       A  Apple   4.0  54.05405
2       A Banana   3.4  45.94595
3       B Orange   2.0 100.00000
4       C  Apple   6.6  56.89655
5       C Banana   5.0  43.10345
6       D  Apple   1.3  16.45570
7       D Orange   6.6  83.54430
8       E  Apple   2.0  34.48276
9       E Banana   1.8  31.03448
10      E Orange   2.0  34.48276

3)可以使用xtabs进行二维布局:

xt <- 100 * prop.table(xtabs(Mass ~ Crate + Fruit, data), 1)

,并提供:

> xt
     Fruit
Crate     Apple    Banana    Orange
    A  54.05405  45.94595   0.00000
    B   0.00000   0.00000 100.00000
    C  56.89655  43.10345   0.00000
    D  16.45570   0.00000  83.54430
    E  34.48276  31.03448  34.48276

可以很容易地显示在这样的图表中:

plot(xt, col = c("red", "yellow", "orange"), 
     main = "Proportion of Mass of Fruit per Crates")

,并提供:

screenshot

可以使用ftable

将2d布局重组为长格式
ftable(xt, row.vars = 1:2)

,并提供:

Crate Fruit            
A     Apple    54.05405
      Banana   45.94595
      Orange    0.00000
B     Apple     0.00000
      Banana    0.00000
      Orange  100.00000
C     Apple    56.89655
      Banana   43.10345
      Orange    0.00000
D     Apple    16.45570
      Banana    0.00000
      Orange   83.54430
E     Apple    34.48276
      Banana   31.03448
      Orange   34.48276

注1:问题中的两行代码可以使用公式表示法编写,如下所示:

aggregate(Mass ~ Crate, data, sum)

aggregate(Mass ~ Fruit + Crate, data, sum)

注2:以可复制的形式使用的输入是:

Lines <- "Fruit    Crate   Mass
Apple    A       4
Banana   A       3.4
Orange   B       2
Apple    C       2.1
Apple    C       4.5
Banana   C       5
Orange   D       1
Apple    D       1.3
Orange   D       2.4
Orange   D       3.2
Orange   E       2
Banana   E       1.1
Banana   E       0.7
Apple    E       2"
data <- read.table(text = Lines, header = TRUE)

答案 1 :(得分:0)

以下是使用data.table的解决方案,尽管还有其他方法:

library( data.table )
setDT( data )
data[ , mass := sum( mass ), by = .( crate, fruit ) ]
data <- unique( data )
data[ , total.mass.crate := sum( mass ), by = crate ]
data[ , percentage.mass.crate := ( mass / total.mass.crate ) * 100 ]

因此,我们首先汇总每个箱子中每个水果的质量(因为我注意到一些水果在一个箱子中被列出不止一次)以获得该箱子中该水果的总质量。然后我们添加一列来显示每个包的总质量,显示每行的值。然后,通过将每个水果的质量除以该箱子的总质量,我们得到每个水果箱中的质量百分比。