如何在R语言中按id分组将有效值上移至数据框顶部
R语言实现分组后有效值上移、NA下移(保留行数结构)
针对需求:按id分组,将values列的非NA值移至每组顶部,NA值移至每组下方,同时保留原数据的行数及id、itemid列的结构,以下是两种常用实现方式:
示例数据集
df <- data.frame(id = c(1,1,1,2,2,2,3,3,3,3), itemid = c(1,2,3,1,2,3,1,2,3,4), values = c(1,NA,0,NA,NA,0,1,NA,0,NA))
方法一:使用dplyr(tidyverse生态)
通过分组提取非NA值,再拼接对应数量的NA替换原列:
library(dplyr) df_processed <- df %>% group_by(id) %>% mutate(values = c(na.omit(values), rep(NA, sum(is.na(values))))) %>% ungroup() # 查看结果 df_processed
输出结果:
# A tibble: 10 × 3 id itemid values <dbl> <dbl> <dbl> 1 1 1 1 2 1 2 0 3 1 3 NA 4 2 1 0 5 2 2 NA 6 2 3 NA 7 3 1 1 8 3 2 0 9 3 3 NA 10 3 4 NA
方法二:使用data.table(适合大数据场景)
利用data.table分组语法实现,逻辑与dplyr一致,执行效率更高:
library(data.table) setDT(df) df_processed <- df[, values := c(na.omit(values), rep(NA, sum(is.na(values)))), by = id] # 查看结果 df_processed
输出结果与方法一完全匹配目标数据集要求。
内容的提问来源于stack exchange,提问作者amisos55
相关产品推荐
相关产品推荐

