首页 > 解决方案 > 如何将具有类似名称的列数据分组以查找总和、最小值和最大值?

问题描述

我正在导入一个包含转置数据的 csv 文件。数据具有以下格式的列:AC1,AC2,AD1,AD2,BP1,BP2,CT1,CO1,CO2,CS1等

我一直希望完成的是分组并找到每个 LIKE 列标题的 SUM 以及每个新分组列的最小值和最大值。

示例是:

AC1+AC2 = AC(sum), min, max

AD1+AD2 = AD(sum), min, max

BP1+BP2 = BP(sum), min, max

只要最终结果有效,格式和结构就无关紧要。

这是否可行,或者是否有更好的方法可以实现这一目标?

我已经通过 Excel 使用了宏,仍然需要一些手动操作来对数据等进行分组。

标签: pythonrexcelvbadata-science

解决方案


假设所有列名都遵循示例中的模式 - 字母的公共前缀后跟数字 - 您可以使用这种方法。

示例数据:

set.seed(1001)
df1 <- data.frame(AC1 = sample(1:100, 50, replace = TRUE),
                  AC2 = sample(1:100, 50, replace = TRUE),
                  AD1 = sample(1:100, 50, replace = TRUE),
                  AD2 = sample(1:100, 50, replace = TRUE),
                  BP1 = sample(1:100, 50, replace = TRUE),
                  BP2 = sample(1:100, 50, replace = TRUE)
)

代码。通过从变量名称中删除数字来创建一个要分组的新变量:

library(tidyr)
library(dplyr)

df1 %>% 
  gather(Var, Val) %>% 
  mutate(Var2 = gsub("\\d+", "", Var)) %>% 
  group_by(Var2) %>% 
  summarise(Sum = sum(Val, na.rm = TRUE), 
            Min = min(Val, na.rm = TRUE), 
            Max = max(Val, na.rm = TRUE))

结果:

# A tibble: 3 x 4
  Var2    Sum   Min   Max
  <chr> <int> <int> <int>
1 AC     4846     1   100
2 AD     4924     4    96
3 BP     5000     1   100

推荐阅读