按两列分组并执行多次计算

Grouping on two columns and performing multiple calculations

我目前正在处理一个由大约 20 列和很多行组成的大型数据框。

简化后看起来像这样:

letter = c("A", "A", "A", "B", "B", "B", "C", "C", "C", "C", "A", "A", "A", "B", "B", "B", "C")
number = c(1,2,3,1,2,1,2,3,2,1,2,3,2,2,3,2,1)\
value1 = c(1:17)
value2 = seq(18, 50, 2)
df = data.frame(letter, number, value1, value2)

我想对特定的值集进行一些计算。这些是字母和数字的独特组合。因此,可以对所有具有字母 A 和数字 1 的值进行求和、计数(或 count_not_zero)、取最小值或其他(更详细的)计算。我的目标是使用这些独特的组合及其计算来制作一个新的数据框。

letter  number  value1.sum  value1.count  ..  value2.max  value2.elaborate
A       1       1           1             ..  18          0.56
A       2       26          3             ..  42          0.40
A       3       15          2             ..  40          0.44
B       1       ..          ..            ..  ..          ..
..      ..      ..          ..            ..  ..          ..
C       2       16          2             ..  34          0.44
C       3       8           1             ..  32          0.50

我尝试了几种方法。例如,用字母 A(在本例中)制作一个矩阵列表,然后在选择单个字母时使用聚合。然而,这变得非常大。

我尝试了几种 DPLYR 包的组合,但很难进行不同类型的计算,尤其是自制的。

如果您正在研究 dplyr,使用 group_bysummarize_each 怎么样?

library(dplyr)

df %>% 
  group_by(letter, number) %>% 
  summarize_each(funs(mean, sum, max, min, n()), value1:value2)

 letter number value1_mean value2_mean value1_sum value2_sum value1_max value2_max value1_min value2_min value1_n value2_n
   (chr)  (dbl)       (dbl)       (dbl)      (int)      (dbl)      (int)      (dbl)      (int)      (dbl)    (int)    (int)
1      A      1    1.000000    18.00000          1         18          1         18          1         18        1        1
2      A      2    8.666667    33.33333         26        100         13         42          2         20        3        3
3      A      3    7.500000    31.00000         15         62         12         40          3         22        2        2
4      B      1    5.000000    26.00000         10         52          6         28          4         24        2        2
5      B      2   11.666667    39.33333         35        118         16         48          5         26        3        3
6      B      3   15.000000    46.00000         15         46         15         46         15         46        1        1
7      C      1   13.500000    43.00000         27         86         17         50         10         36        2        2
8      C      2    8.000000    32.00000         16         64          9         34          7         30        2        2
9      C      3    8.000000    32.00000          8         32          8         32          8         32        1        1

您可以轻松制作自己的辅助函数来输出您正在寻找的更精细的计算,然后在 funs.

中调用它们

一种定义自定义汇总操作的粗略方式。

letter = c("A", "A", "A", "B", "B", "B", "C", "C", "C", "C", "A", "A", "A", "B", "B", "B", "C")
number = c(1,2,3,1,2,1,2,3,2,1,2,3,2,2,3,2,1)
value1 = c(1:17)
value2 = seq(18, 50, 2)
df = data.frame(letter, number, value1, value2)


library(dplyr)
myFunc <- function(a) { sum(abs(a)) }
myStats <- c("sum", "length", "max", "min", "myFunc")
dots <- lapply(1:2, function(i) sprintf("~%s(value%d)", myStats, i)) %>% 
  unlist()
dots <- setNames(dots, sub("\(", ".", gsub("[\)~]", "", dots))) %>%
  as.list() %>%
  lapply(as.formula)
group_by(df, letter, number) %>%
  summarize_(.dots = dots)