python - 计算数据框中特定列(SUM、AVG、STDEV)的所有嵌套级别聚合
问题描述
我有一个如下所示的表格(简化):
col_A col_B col_C
A 37 2
B 28 7
C 10 5
D 11 5
E 99 4
我想得到一个表,其中包含 col_A 的每个级别的所有嵌套组合,并计算子组内的平均值:例如,choose-any-2 表看起来像(10 个唯一级别组合):
Grp_2 AVG (col_B/col_C)
A,B 7.76
A,C 6.61
A,D 7.55
… …
D,E 12.99
Choose-any-4 看起来像(5 个独特的关卡组合):
Grp_4 AVG (col_B/col_C)
A,B,C,D 7.84
A,B,C,E 6.68
A,C,D,E 7.63
… …
B,C,D,E 13.12
(顺序优先)R,SQL(postgres,ANSI),Python。; 我目前在R中的解决方案(如下)不能很好地随着增长级别的数量而col_A
扩展:
require(tidyverse)
df <- tibble(col_A=c("A", "B","C", "D", "E"), col_B=c(37,28,10,11,99), col_C=c(2,7,5,5,4))
nested_subgroup_agg <- function(choice = 2, mydf = NULL) {
library(tidyverse)
dfx <-
combn(c("A", "B", "C", "D", "E"), choice) %>%
t() %>%
as_tibble()
try(if (choice <= 1) {
stop("Can't Choose less than 2 levels at a time")
}
else{
if (choice == 2) {
val <- map_dbl(1:nrow(dfx), function(i) {
(mydf$col_B[mydf$col_A == dfx$V1[i]] + mydf$col_B[mydf$col_A == dfx$V2[i]]) /
(mydf$col_C[mydf$col_A == dfx$V1[i]] + mydf$col_C[mydf$col_A == dfx$V2[i]])
})
}
else{
if (choice == 3) {
val <- map_dbl(1:nrow(dfx), function(i) {
(mydf$col_B[mydf$col_A == dfx$V1[i]] + mydf$col_B[mydf$col_A == dfx$V2[i]] + mydf$col_B[mydf$col_A == dfx$V3[i]]) /
(mydf$col_C[mydf$col_A == dfx$V1[i]] + mydf$col_C[mydf$col_A == dfx$V2[i]] + mydf$col_C[mydf$col_A == dfx$V3[i]])
})
}
else{
if (choice == 4) {
val <- map_dbl(1:nrow(dfx), function(i) {
(mydf$col_B[mydf$col_A == dfx$V1[i]] + mydf$col_B[mydf$col_A == dfx$V2[i]] + mydf$col_B[mydf$col_A == dfx$V3[i]] + mydf$col_B[mydf$col_A == dfx$V4[i]]) /
(mydf$col_C[mydf$col_A == dfx$V1[i]] + mydf$col_C[mydf$col_A == dfx$V2[i]] + mydf$col_C[mydf$col_A == dfx$V3[i]] + mydf$col_C[mydf$col_A == dfx$V4[i]])
})
}
}
}
})
dfx$val <- val
dfx
}
## Example
df <-
tibble(
col_A = c("A", "B", "C", "D", "E"),
col_B = c(37, 28, 10, 11, 99),
col_C = c(2, 7, 5, 5, 4)
)
nested_subgroup_agg(choice = 4, mydf = df)
你能帮忙改进吗?
解决方案
一个想法是用来combn
获取行的所有组合(考虑到每行有 1 个字母),然后简单地每 2 行聚合一次,即
#get a df with all combination of rows
new_d <- dd[c(combn(nrow(dd), 2)),]
#Aggregate
#You can use `aggregate` or `lapply(split())`
lapply(split(new_d, rep(seq((nrow(new_d)) / 2), each = 2)), function(i)sum(i$col_C))
数据
dput(dd)
structure(list(col_A = structure(1:5, .Label = c("A", "B", "C",
"D", "E"), class = "factor"), col_B = c(37L, 28L, 10L, 11L, 99L
), col_C = c(2L, 7L, 5L, 5L, 4L)), class = "data.frame", row.names = c(NA,
-5L))
推荐阅读
- python - vscode格式化具有许多元素的列表变量
- javascript - 如何使用 javascript 在 url 中传递变量并使用 php 接收它们?
- docker - 在开发过程中,我应该使用什么 url 从浏览器向容器发出请求?
- javascript - 绕过randomwebsite.com网站的时间到期
- python - 在 C 中嵌入 Python 并为 Python 共享库生成导入错误
- laravel - 在 adminLTE 中添加 laravel 刀片内容
- python - 如何使用文件路径作为 os.walk 中的源参数来复制文件
- python - Plotly:如何在 Excel 中嵌入完全交互式的 Plotly 图形?
- java - javac:无效标志:编译 java servlet 时出错
- python - Django 异常未注册的命名空间