对两列进行分组并执行多次计算

时间:2016-11-29 14:01:01

标签: r select multiple-columns multiple-conditions submatrix

我目前正在处理一个包含粗体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包的组合,但很难做出不同类型的计算,尤其是自制计算。

2 个答案:

答案 0 :(得分:1)

如果你正在研究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内调用它们。

答案 1 :(得分:0)

定义自定义汇总操作的粗略方法。

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)