如何基于位置矩阵划分连续区域并生成统计矩阵?
这是个典型的连续序列分组+聚合统计问题,我给你用R和Python两种数据分析常用工具来实现,代码简洁易懂,完全匹配你要的统计结果:
用R实现(dplyr包)
R的tidyverse系列工具处理这种分组统计非常顺手,步骤如下:
# 1. 构造原始数据框 df <- data.frame( position = c(1,2,3,6,8,9,10,11), case = c(2,4,1,12,5,22,1,12), control = c(1,10,7,3,5,9,24,2) ) # 2. 生成连续区域的分组ID # 用diff计算相邻位置差,差不为1的地方标记为新区域,cumsum累加生成区域编号 df$region <- cumsum(c(1, diff(df$position) != 1)) # 3. 按区域分组计算所需统计量 library(dplyr) result <- df %>% group_by(region) %>% summarise( start = min(position), end = max(position), min_case = min(case), max_case = max(case), mean_case = round(mean(case), 2), # 保留两位小数和示例一致 min_control = min(control) ) # 输出结果 print(result)
运行后得到的结果和你要求的完全一致:
region start end min_case max_case mean_case min_control
1 1 3 1 4 2.33 1
2 6 6 12 12 12.00 3
3 8 11 1 22 10.00 2
用Python实现(pandas库)
如果习惯用Python做数据分析,pandas同样可以轻松搞定:
import pandas as pd # 1. 构造原始DataFrame data = { 'position': [1,2,3,6,8,9,10,11], 'case': [2,4,1,12,5,22,1,12], 'control': [1,10,7,3,5,9,24,2] } df = pd.DataFrame(data) # 2. 生成连续区域的分组ID # diff()计算相邻位置差,不等于1则标记为True,cumsum()累加生成区域编号 df['region'] = (df['position'].diff() != 1).cumsum() # 3. 按区域分组聚合统计量 result = df.groupby('region').agg( start=('position', 'min'), end=('position', 'max'), min_case=('case', 'min'), max_case=('case', 'max'), mean_case=('case', lambda x: round(x.mean(), 2)), # 保留两位小数 min_control=('control', 'min') ).reset_index() # 输出结果 print(result)
运行后输出的结果和你需要的统计矩阵完全匹配。
内容的提问来源于stack exchange,提问作者H. dashti
相关产品推荐
相关产品推荐

