如何在R中将长格式数据转换为含0/1标识的宽格式?
在R中高效将长格式爱好数据转为宽格式(0/1标识)
给定长格式数据:
mydata <- data.frame(id = c(1,1,1,2,2,3,4), hobby = c("music", "sports", "science", "science", "lifestyle", "party", "sports"), x = c(10, 10, 10, 23, 23, 11, 0), y = c(78, 78, 78, 55, 55, 22, 9))
需要将其转为宽格式,每个hobby类别作为单独列,用0/1标识对应id是否拥有该爱好,同时保留x、y等同id下一致的列,以下是两种高效实现方案:
方案一:使用tidyverse工具链(语法清晰,适合常规数据量)
借助dplyr的分组处理和tidyr的pivot_wider函数,自动识别所有hobby类别并生成对应列:
library(tidyverse) wide_data <- mydata %>% group_by(id) %>% mutate(has_hobby = 1) %>% pivot_wider( id_cols = c(id, x, y), names_from = hobby, values_from = has_hobby, values_fill = 0 ) %>% ungroup() %>% distinct(id, .keep_all = TRUE) # 去重保留每个id的唯一行
方案二:使用data.table(性能优异,适合大数据/多类别场景)
当hobby类别极多或数据量庞大时,data.table的dcast函数在速度上有显著优势:
library(data.table) setDT(mydata) wide_data <- dcast( mydata, id + x + y ~ hobby, fun.aggregate = function(x) as.integer(length(x) > 0), fill = 0 )
两种方案最终输出结果均符合目标格式:
> wide_data id x y music sports science lifestyle party 1 1 10 78 1 1 1 0 0 2 2 23 55 0 0 1 1 0 3 3 11 22 0 0 0 0 1 4 4 0 9 0 1 0 0 0
内容的提问来源于stack exchange,提问作者Adrian
相关产品推荐
相关产品推荐

