R语言合并df.list中多数据框时每年首行丢失问题排查
错误定位
你的代码存在4个核心问题,共同导致了最终结果异常:
- 语法错误:删除
*行的代码存在变量名拼写错误,将new.df的点误写为逗号,变成new,df,这行代码本身无法正确执行,达不到过滤效果。 - 过滤逻辑执行时机错误:你当前的过滤代码写在for循环结束之后,仅能对最后一次循环生成的
new.df生效,for循环内每次生成的new.df都没有经过过滤就直接存入了df.list,所有子数据框的*行都被保留到了合并阶段。 - 列表元素读取错误:split生成的
d是列表结构,d[i]返回的是包含单个数据框的子列表,直接用data.frame(d[i])生成的新数据框会自动给列名加前缀,可能引发后续列名、类型判断的异常,应该用d[[i]]直接取出列表中的对应数据框。 - 数据类型问题:
stack生成的values列默认可能是因子类型,直接和字符串"*"做相等判断时可能出现预期外的结果,建议先转为字符型再做判断。
修正后的完整代码
# 拆分原始表格 d <- split(table.df, r) # 初始化结果存储列表 df.list <- list() for (i in 1:length(d)) { # 直接取出列表中的子数据框 df <- d[[i]] # 转置为两列结构 new.df <- stack(df) # 过滤values为*的行,先转字符型避免因子判断异常 new.df <- new.df[!(as.character(new.df$values) == "*"), ] # 处理完成后存入列表 df.list[[i]] <- new.df } # 按行合并所有子数据框 merge.row = do.call(rbind, df.list)
内容的提问来源于stack exchange,提问作者55na
相关产品推荐
相关产品推荐

