如何用reshape2的dcast函数生成与原数据框行数一致的结果?
解决方法
要生成和原数据框行数一致的结果,你需要避免dcast的默认聚合行为——它会对相同的分组键(这里是aa)合并统计。可以通过以下几种方式实现:
方法1:给原数据添加唯一行标识,再用dcast
先给每行加一个唯一的id,让dcast按id分组(每个分组仅一行),这样就不会合并行:
library(reshape2) dat = data.frame(aa = c('A', 'B', 'C', 'C', 'B')) # 添加唯一行id dat$id <- 1:nrow(dat) # 用dcast生成结果,最后去掉id列 result <- dcast(dat, id ~ aa, fun.aggregate = length, value.var = "aa") result <- result[, -1]
输出结果:
A B C 1 1 0 0 2 0 1 0 3 0 0 1 4 0 0 1 5 0 1 0
方法2:用model.matrix直接生成独热编码
这是更简洁的方式,无需额外分组:
model.matrix(~ aa - 1, data = dat)
输出结果(列名默认带前缀aa,可自行修改):
aaA aaB aaC 1 1 0 0 2 0 1 0 3 0 0 1 4 0 0 1 5 0 1 0
方法3:用tidyr的pivot_wider(推荐,reshape2的现代替代)
如果可以切换到tidyverse工具链,pivot_wider更直观:
library(tidyr) library(dplyr) dat %>% mutate(id = row_number(), val = 1) %>% pivot_wider(names_from = aa, values_from = val, values_fill = 0) %>% select(-id)
输出和方法1完全一致。
内容的提问来源于stack exchange,提问作者Brian Smith
相关产品推荐
相关产品推荐

