如何在R语言中评估物种在连续年份中的存续状态(消失、新增、留存)
物种相邻年份状态判断方案
假设你的数据是宽格式(每行一个物种,每列对应年份,值标记物种是否在该年出现,比如1=存在、0=不存在),可以用Python的pandas库完成需求,步骤如下:
处理逻辑
- 将宽格式数据转为长格式,便于按物种和年份顺序处理
- 对每个物种,对比相邻年份的存在状态,判断是新增、留存还是消失
- 将结果转回宽格式,匹配你期望的输出样式
代码实现
import pandas as pd # 替换为你的实际数据 raw_data = pd.DataFrame({ 'Species': ['物种A', '物种B', '物种C'], '2000': [1, 0, 1], '2001': [1, 1, 0], '2002': [0, 1, 1] }) # 1. 转长格式:物种、年份、存在状态 long_format = raw_data.melt( id_vars='Species', var_name='Year', value_name='Present' ) long_format['Year'] = long_format['Year'].astype(int) long_format = long_format.sort_values(['Species', 'Year']) # 2. 计算相邻年份状态 def calculate_status(group): # 获取下一年的存在状态 group['Next_Present'] = group['Present'].shift(-1) # 定义状态判断规则 status_conditions = [ (group['Present'] == 1) & (group['Next_Present'] == 0), # 当年存在→下年消失 (group['Present'] == 0) & (group['Next_Present'] == 1), # 当年不存在→下年新增 (group['Present'] == 1) & (group['Next_Present'] == 1) # 两年都存在→留存 ] status_labels = ['消失', '新增', '留存'] group['Status'] = pd.np.select(status_conditions, status_labels, default=None) # 生成年份区间(如2000-2001) group['Year_Range'] = group['Year'].astype(str) + '-' + group['Year'].shift(-1).astype(str) # 过滤掉无后续年份的行 return group.dropna(subset=['Status']) # 按物种分组计算状态 status_result = long_format.groupby('Species').apply(calculate_status).reset_index(drop=True) # 3. 转回宽格式,生成最终输出 final_output = status_result.pivot( index='Species', columns='Year_Range', values='Status' ).reset_index() print(final_output)
注意事项
- 如果你的原始数据中用缺失值表示物种未出现,需要先将缺失值转为0,存在值转为1,可添加代码:
raw_data = raw_data.fillna(0).replace({'存在':1, '不存在':0})(根据实际值调整替换规则) - 若使用R语言,可类似用
tidyr包的pivot_longer/pivot_wider函数结合dplyr分组处理
内容的提问来源于stack exchange,提问作者Gull
相关产品推荐
相关产品推荐

