如何还原制表后的data.frame?使用DescTools::Lambda遇rep报错求助
按计数列还原因子组合表格的正确方法
你有一个包含因子组合及对应计数的data.frame:
z <- data.frame(a=factor(c("x","x","x","y","y","y")), b=factor(c("a","b","c","a","b","c")), count=c(2,5,1,4,5,1))
直接执行rep(z[,1:2], z$count)会报错,原因是rep处理data.frame时默认按列重复,无法接受向量形式的times参数实现按行重复。
以下是几种可行的解决方案:
- 基础R实现:通过行索引重复
利用行索引向量实现按行重复,是最直接的基础R写法:
z_expanded <- z[rep(seq_len(nrow(z)), z$count), 1:2]
seq_len(nrow(z))生成每行的位置索引,rep根据count列的值重复对应索引,最后按索引提取行即可得到展开后的因子组合表格。
- tidyverse工具:tidyr::uncount
如果使用tidyverse生态,tidyr::uncount专门处理频数展开需求,代码更简洁:
library(tidyr) z_expanded <- uncount(z, count) %>% select(a, b)
uncount自动按count列的值重复每行,select(a, b)用来只保留需要的因子列。
- DescTools内置方案:Expand.table
既然你要使用DescTools::Lambda,可以直接用同包的Expand.table函数——它就是为将频数表还原为原始观测表设计的:
library(DescTools) z_expanded <- Expand.table(z, freq = "count") %>% select(a, b)
该方法无需额外依赖其他包,和你后续要使用的Lambda函数兼容性更好。
验证展开结果的前几行:
head(z_expanded)
输出符合预期:
a b 1 x a 2 x a 3 x b 4 x b 5 x b 6 x b
内容的提问来源于stack exchange,提问作者cdalitz
相关产品推荐
相关产品推荐

