You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 17:18:03