我目前正在处理一个包含粗体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包的组合,但很难做出不同类型的计算,尤其是自制计算。
答案 0 :(得分:1)
如果你正在研究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
内调用它们。
答案 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)