R语言按分组变量折叠行并移除NA空值的实现方法
按用户ID合并多行数据(去除NA保留单行)
你需要的按user_id分组、将所有评分列的非NA值整合到单行的实现方法如下,优先提供tidyverse生态方案,同时附基础R兼容方案,两种方案输出均为标准data.frame/tibble格式(tibble是data.frame的扩展,完全兼容所有data.frame操作)。
Tidyverse 实现方案
# 加载dplyr包(tidyverse核心数据处理包) library(dplyr) df_result <- df %>% # 按用户ID分组 group_by(user_id) %>% # 对所有评分列提取非NA值,每个用户每列仅保留1个有效非NA值 summarise( across(c(r1, r2, r3, r4, r5), ~.x[!is.na(.x)][1]), .groups = "drop" # 处理完解除分组,返回普通数据框结构 )
如果你的评分列命名规则统一为r+数字,可以把列选择部分简化为across(starts_with("r"), ~.x[!is.na(.x)][1]),不用逐个输入列名,适配评分列更多的场景。
该写法会自动保留全NA列的NA值,不会抛出错误,适配存在缺失评分的场景。
基础R 实现方案(无额外依赖)
如果不想加载第三方包,可以直接用基础包的aggregate函数实现:
df_result_base <- aggregate( . ~ user_id, data = df, FUN = function(x) x[!is.na(x)][1], na.action = na.pass )
运行后直接返回标准data.frame格式结果,处理逻辑和tidyverse方案完全一致。
结果验证
用你提供的示例数据运行后,打印结果和预期结构完全匹配:
user_id r1 r2 r3 r4 r5 1 12345 1 1 1 1 1 2 12356 1 1 1 1 1
内容的提问来源于stack exchange,提问作者Adrien McCulloch
相关产品推荐
相关产品推荐

