按站点统计各物种跨周总数及每周物种占比的技术需求
问题描述
我的数据如下:
week site dog cat mouse 1 a 2 50 10 1 b 5 25 10 1 c 3 25 30 2 a 75 1 5 2 b 25 9 4 2 c 0 0 1
需要按每个站点统计各物种的跨周总数,再基于该总数计算每周各物种在对应站点的占比。例如,站点'a'的狗跨周总数为77只:第1周2只(占比2.5%),第2周75只(占比97.4%)。已给出狗占比的示例输出,需要生成所有物种的占比结果。
R 实现方案
使用dplyr包分组计算,步骤清晰易读:
library(dplyr) # 构造数据框 df <- data.frame( week = c(1,1,1,2,2,2), site = c("a","b","c","a","b","c"), dog = c(2,5,3,75,25,0), cat = c(50,25,25,1,9,0), mouse = c(10,10,30,5,4,1) ) # 分组计算各物种占比 result <- df %>% group_by(site) %>% mutate( dog.prop = round(dog / sum(dog), 3), cat.prop = round(cat / sum(cat), 3), mouse.prop = round(mouse / sum(mouse), 3) ) %>% ungroup() # 查看最终结果 print(result)
运行后输出:
# A tibble: 6 × 8 week site dog cat mouse dog.prop cat.prop mouse.prop <dbl> <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> 1 1 a 2 50 10 0.025 0.98 0.667 2 1 b 5 25 10 0.167 0.735 0.714 3 1 c 3 25 30 1 1 0.968 4 2 a 75 1 5 0.975 0.02 0.333 5 2 b 25 9 4 0.833 0.265 0.286 6 2 c 0 0 1 0 0 0.032
Python 实现方案
使用pandas库的分组变换功能快速计算:
import pandas as pd # 构造数据 data = { 'week': [1,1,1,2,2,2], 'site': ['a','b','c','a','b','c'], 'dog': [2,5,3,75,25,0], 'cat': [50,25,25,1,9,0], 'mouse': [10,10,30,5,4,1] } df = pd.DataFrame(data) # 循环处理每个物种的占比计算 species = ['dog', 'cat', 'mouse'] for sp in species: df[f'{sp}.prop'] = df.groupby('site')[sp].transform(lambda x: round(x / x.sum(), 3)) # 输出结果 print(df)
运行后输出:
week site dog cat mouse dog.prop cat.prop mouse.prop 0 1 a 2 50 10 0.025 0.98 0.667 1 1 b 5 25 10 0.167 0.735 0.714 2 1 c 3 25 30 1.000 1.00 0.968 3 2 a 75 1 5 0.975 0.02 0.333 4 2 b 25 9 4 0.833 0.265 0.286 5 2 c 0 0 1 0.000 0.00 0.032
内容的提问来源于stack exchange,提问作者novice_coder
相关产品推荐
相关产品推荐

