R语言基于因子水平填充NA、spread转宽表后合并同组值实现方法
解决方案
你可以直接对当前spread得到的结果按plot分组后,提取每列的非NA值完成合并,也可以直接改用更现代的pivot_wider()函数完成长表转宽表,从源头避免生成多NA行的问题:
方法1:直接处理现有spread结果
用dplyr分组汇总即可,逻辑是同一plot分组下每个x列仅存在1个非NA值,直接提取该值即可完成合并:
library(tidyverse) # 替换df为你自己的数据集名称 merged_df <- df %>% group_by(plot) %>% summarise(across(starts_with("x"), ~ first(na.omit(.x))))
方法2:改用pivot_wider完成长转宽(推荐)
spread()已经属于过时函数,改用tidyr提供的pivot_wider()可以在转换阶段直接处理同组多值的情况,不需要二次处理:
# 替换long_df为你的原始纵向结构数据集,替换对应的列名即可 wide_df <- long_df %>% pivot_wider( id_cols = plot, names_from = 你原来用于生成x1-x7的分类列名, values_from = 你原来存储数值的列名, values_fn = first )
方法3:Base R实现
如果你不想加载第三方包,可以用aggregate()函数实现相同效果:
merged_df <- aggregate(. ~ plot, data = df, FUN = function(x) na.omit(x)[1], na.action = NULL)
内容的提问来源于stack exchange,提问作者McPauwl
相关产品推荐
相关产品推荐

