You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在R语言中评估物种在连续年份中的存续状态(消失、新增、留存)

物种相邻年份状态判断方案

假设你的数据是宽格式(每行一个物种,每列对应年份,值标记物种是否在该年出现,比如1=存在、0=不存在),可以用Python的pandas库完成需求,步骤如下:

处理逻辑

  1. 将宽格式数据转为长格式,便于按物种和年份顺序处理
  2. 对每个物种,对比相邻年份的存在状态,判断是新增、留存还是消失
  3. 将结果转回宽格式,匹配你期望的输出样式

代码实现

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 12:17:15