R语言整理冗余数据:将统计单元多观测合并至单行
解决方法:用dplyr/tidyr合并同统计单元的多行数据
针对你遇到的多类型变量合并问题,这里有两种简洁的方法,都能完美适配数值、字符、日期时间等多种变量类型:
方法一:dplyr 直接合并(最高效)
因为你的数据中,同一Unit的不同行里,每个变量列(比如VAR1-time1)只有一行有有效值,其余都是NA,所以我们可以按Unit分组后,对每一列取第一个非NA值:
library(dplyr) # 合并数据并移除冗余的TIME列 df_cleaned <- df %>% group_by(Unit) %>% summarise( across(everything(), ~ first(na.omit(.x))), .groups = "drop" # 合并后取消分组,避免状态残留 ) %>% select(-TIME)
原理说明
group_by(Unit):按统计单元分组,确保同一Unit的行被放在一起处理across(everything(), ~ first(na.omit(.x))):对每一列先剔除所有NA值,再取第一个(也是唯一的)有效值——这个逻辑对所有数据类型都适用,不管是数值、字符还是日期时间.groups = "drop":处理完成后取消分组,方便后续数据操作select(-TIME):移除冗余的TIME列,毕竟列名已经包含了时间点信息
方法二:tidyr 长-宽格式转换(更灵活)
如果以后你的数据结构有变化(比如同一时间点可能出现多个有效值),可以用长格式转换的思路,先把数据转成长格式过滤NA,再转回宽格式:
library(tidyr) library(dplyr) df_cleaned <- df %>% # 把所有VAR开头的列转成长格式,自动过滤NA值 pivot_longer( cols = starts_with("VAR"), names_to = c("Variable", "Time"), names_sep = "-", values_drop_na = TRUE ) %>% # 转回宽格式,每个Unit对应一行 pivot_wider( names_from = c(Variable, Time), values_from = value ) %>% # 移除冗余的TIME列 select(-TIME)
原理说明
pivot_longer:把分散在多列的时间点变量整合到Variable(变量名)和Time(时间点)两列,同时通过values_drop_na = TRUE自动过滤无效的NA值pivot_wider:把长格式数据转回宽格式,最终每个Unit对应一行,所有时间点的变量作为独立列保留
为什么你的原方法不行?
你之前用的mean函数只支持数值/逻辑类型的变量,遇到字符、日期时间这类非数值型变量就会报错。而上面两种方法都是基于“提取非NA有效值”的逻辑,完全不限制变量类型,完美解决你的问题。
内容的提问来源于stack exchange,提问作者Zelus1
相关产品推荐
相关产品推荐

