如何在R中使用dcast或tidyverse将单列拆分为多列实现宽表转换
解决方案
你的原有代码存在以下问题:
row_number()无需传入first、second等待生成的列名,直接调用即可生成行号作为宽表转换的分组依据- 缺少值填充列,转换后会出现空值,无法直接得到你需要的0/1标识
spread是tidyr的旧版弃用函数,更推荐用逻辑更清晰的pivot_wider完成宽表转换
下面是完整可运行的tidyverse管道流实现代码:
# 加载依赖包 library(tidyverse) # 构造示例数据(原代码字符串需补充引号) data <- data.frame( trimesterPeriod = c("first", "second", "third", "PP", "third", "second", "PP", "first") ) # 单列转宽格式代码 result <- data %>% # 生成行号作为ID列 mutate(ID = row_number(), # 新增填充列,存在对应类别时标记为1 value = 1) %>% # 转换为宽格式:names_from指定取哪个列的值作为新列名,values_from指定用哪个列的值填充,values_fill指定空值填充为0 pivot_wider(names_from = trimesterPeriod, values_from = value, values_fill = 0)
运行上述代码后输出的result即为你需要的目标数据格式。如果你偏好使用dcast实现,也可以用以下代码:
library(data.table) setDT(data) result <- dcast(data, rowid(trimesterPeriod) ~ trimesterPeriod, fun.aggregate = length) setnames(result, old = "trimesterPeriod", new = "ID")
如果你坚持要使用spread函数,修正后的写法如下:
result <- data %>% mutate(ID = row_number(), value = 1) %>% spread(key = trimesterPeriod, value = value, fill = 0)
内容的提问来源于stack exchange,提问作者lziegs
相关产品推荐
相关产品推荐

