R语言按fundid分组计算flowpct时出现TRUE/FALSE缺失报错如何解决?
问题原因解析
你的代码存在3个核心错误,直接触发报错和警告:
- 循环遍历逻辑错误:
for (i in esg.ordered)是遍历数据框的所有列,而非行索引,导致i每次对应的是整列向量,所以esg.ordered$fundid[i]返回的是长度为n的向量,if条件要求输入单个逻辑值,才会触发「条件长度大于1」的警告。 - lag函数使用错误:lag是作用于整个向量计算滞后项的函数,你对单个值
esg.ordered$fundid[i]调用lag,返回的结果是NA,比较后无法生成有效逻辑值,才会触发缺失值报错。 - 赋值逻辑错误:你给
esg.ordered$flowpct赋值时没有指定行索引[i],每次循环都会覆盖整列数据,且你赋值的字符串"NA"不是R中标准的缺失值类型,会把列转为字符型。
修复方案
方案1:修正原生R循环代码
# 先初始化flowpct列为缺失值NA esg.ordered$flowpct <- NA # 从第2行开始遍历,第1行无前置数据天然为NA for (i in 2:nrow(esg.ordered)) { # 直接比较当前行和上一行的fundid,不需要调用lag if(esg.ordered$fundid[i] == esg.ordered$fundid[i-1]){ # 当前行flow除以上一行的size,仅给当前行赋值 esg.ordered$flowpct[i] <- esg.ordered$flow[i] / esg.ordered$size[i-1] } }
方案2:使用dplyr包分组计算,更简洁高效
不需要写循环,按fundid分组后直接计算滞后项即可,自动为每个fundid的第一行赋值NA,完全符合需求:
library(dplyr) esg.ordered <- esg.ordered %>% group_by(fundid) %>% mutate(flowpct = flow / lag(size)) %>% ungroup()
内容的提问来源于stack exchange,提问作者CodingGirl
相关产品推荐
相关产品推荐

