按两列分组并执行多次计算
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_by
和 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
.
中调用它们
一种定义自定义汇总操作的粗略方式。
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)
我目前正在处理一个由大约 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_by
和 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
.
一种定义自定义汇总操作的粗略方式。
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)