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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 07:55:26