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

R语言:聚合数据框时生成存在性哑变量的技术需求

解决按ID聚合并生成Info哑变量的问题

首先得提个小细节:你提供的原始数据里第二行1 2 1 A和表头的3列不匹配,会导致read.table报错,我先修正了数据框的创建代码,确保能正常读取数据:

# 修正后的数据框创建代码
dat <- read.table(textConnection('ID Score Info
1 1 A
1 2 A
10 3 B
7 4 C
8 5 B
9 6 B
1 7 B
7 8 C
8 9 C
3 10 A'), header = TRUE)

接下来分两种方法实现你的需求:按ID聚合统计行数,同时生成Info列的哑变量(某ID下存在A/B/C则对应值为1,否则为0)。

方法一:用dplyr(推荐,代码更直观)

如果你的环境还没装dplyr包,先运行install.packages("dplyr")安装。代码逻辑清晰易懂:分组后统计行数,再判断每个类别是否存在:

library(dplyr)

result <- dat %>%
  # 按ID分组
  group_by(ID) %>%
  # 聚合操作:统计行数,同时判断A/B/C是否存在
  summarise(
    row_count = n(),  # 统计每个ID对应的行数
    has_A = as.integer(any(Info == "A")),  # 存在A则为1,否则0
    has_B = as.integer(any(Info == "B")),
    has_C = as.integer(any(Info == "C"))
  ) %>%
  # 取消分组(可选,但后续操作更方便)
  ungroup()

# 查看结果
print(result)

运行后会得到这样的输出:

# A tibble: 6 × 4
     ID row_count has_A has_B has_C
  <int>     <int>  <int>  <int>  <int>
1     1         3      1      1      0
2     3         1      1      0      0
3     7         2      0      0      1
4     8         2      0      1      1
5     9         1      0      1      0
6    10         1      0      1      0

方法二:用基础R实现(无需额外包)

如果不想加载第三方包,用基础R的aggregate和table也能实现:

# 第一步:统计每个ID的行数
count_df <- aggregate(Score ~ ID, data = dat, FUN = length)
colnames(count_df)[2] <- "row_count"  # 重命名列名

# 第二步:生成每个ID的Info类别存在情况
info_table <- table(dat$ID, dat$Info)
# 将计数转换为0/1(只要出现过就为1)
info_dummy <- as.data.frame.matrix(info_table > 0)
# 把逻辑值转成整数0/1
info_dummy <- lapply(info_dummy, as.integer) %>% as.data.frame()
# 把行名转成ID列,方便合并
info_dummy$ID <- as.integer(rownames(info_dummy))
rownames(info_dummy) <- NULL

# 第三步:合并行数统计和哑变量
result_base <- merge(count_df, info_dummy, by = "ID")

# 查看结果
print(result_base)

这个方法的结果和方法一完全一致,只是用了基础R的函数实现。

内容的提问来源于stack exchange,提问作者user2797174

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 08:25:22