使用R与SimFin数据做资产负债表分析时pivot_wider执行失败问题
问题原因
你遇到的Values are not uniquely identified警告核心原因是:资产负债表预处理后的数据集MSFT_2中,存在同一个year+acc_name组合对应多条重复记录。pivot_wider默认要求每一组用于确定行位置的键值(这里你只保留了year作为行键)对应唯一的acc_value,当出现多值匹配时就会返回列表格式的列,导致无法直接绘图。
你用str()只能看到数据结构一致,无法识别内部的重复键,利润表数据没有这类重复,因此转换正常。常见的重复来源包括:
- 拉取资产负债表时参数使用错误:官方文档明确说明
periods = 'FY'仅适用于利润表和现金流量表,若拉取资产负债表时未替换为periods = 'Q4',会返回异常的重复周期数据 - 同一年份存在多版财报数据:比如企业重报修订后的财报,SimFin会同时返回原始和修订版本,你预处理时未过滤
ref_date(财报发布日期)或period字段就提取三个核心字段,导致重复 - 数据清洗阶段引入的意外重复
排查方法
运行以下代码即可定位具体的重复组合:
library(dplyr) MSFT_2 %>% count(year, acc_name, sort = TRUE) %>% filter(n > 1)
返回结果中n>1的行就是存在重复的年份+会计科目组合。
解决方案
方案1:修正拉取参数(最推荐)
拉取资产负债表时严格使用官方指定的参数,避免返回无效重复数据:
MSFT_BS_Raw <- simfinR_get_fin_statements(59265, type_statements = 'bs', periods = 'Q4', years = 2009:2020, api_key = simfin_api_key)
重新拉取后再做预处理和宽表转换即可。
方案2:转换时指定聚合规则
如果不想重新拉取数据,可以在pivot_wider中指定多值匹配时的处理规则,比如优先取非空的第一个值:
MSFT_BS <- pivot_wider(MSFT_2, names_from = acc_name, values_from = acc_value, values_fn = ~first(na.omit(.x)))
如果重复值完全一致,也可以用values_fn = mean/values_fn = max等聚合函数。
方案3:先去重再转换
预处理阶段先按行键去重,再做宽表转换:
MSFT_BS <- MSFT_2 %>% distinct(year, acc_name, .keep_all = TRUE) %>% pivot_wider(names_from = acc_name, values_from = acc_value)
内容的提问来源于stack exchange,提问作者kamonegi
相关产品推荐
相关产品推荐

