-2

我目前正在使用一个包含大约 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 包的组合,但很难进行不同类型的计算,尤其是自制的。

4

2 回答 2

1

如果您正在研究dplyr,使用group_byand怎么样summarize_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.

于 2016-11-29T14:18:11.427 回答
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)
于 2016-11-29T14:25:32.717 回答