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
相关产品推荐
相关产品推荐

