R语言按ID分组生成所有非NA值组合 兼容非数值数据实现方法
实现思路
按ID分组后,对每一列提取该组内所有非NA的唯一取值,再生成同一ID下各列取值的全笛卡尔乘积,即可得到所有符合要求的组合结果。该逻辑对数值、字符、因子、日期等所有R原生支持的向量类型均有效,可直接适配非数值类数据。
实现方案
方案1:tidyverse实现(代码简洁易读)
需先安装加载tidyverse包:
library(tidyverse) # 处理代码 result <- DF %>% # 按ID分组 group_by(ID) %>% # 对所有列提取非NA唯一值,自动生成全组合 reframe( across(everything(), ~{ # 兼容某列全为NA的极端情况 if(all(is.na(.x))) NA else unique(na.omit(.x)) }) ) %>% ungroup()
方案2:base R实现(无需依赖第三方包)
result <- do.call(rbind, lapply(split(DF, DF$ID), function(sub_df) { # 对分组内每列提取非NA唯一值 col_vals <- lapply(sub_df, function(col) { if(all(is.na(col))) NA else unique(na.omit(col)) }) # 生成所有列的全组合,关闭自动转因子避免字符类型被转换 expand.grid(col_vals, stringsAsFactors = FALSE) })) # 重置行号 rownames(result) <- NULL
两种方案输出均与预期结果完全一致,且无需额外修改即可支持非数值类型数据的处理。
内容的提问来源于stack exchange,提问作者Aaron
相关产品推荐
相关产品推荐

