如何将长格式DataFrame转换为二进制DataFrame
这是个非常常见的长格式转宽格式并生成二进制标记的需求,我给你几个实用的R解决方案,都能轻松得到你想要的结果:
方法1:用tidyverse的tidyr包(推荐,语法直观)
tidyverse是现在R数据分析的主流工具集,其中的pivot_wider函数专门用来处理长转宽的需求,配合参数设置就能直接生成二进制标记:
# 先加载tidyverse包(包含tidyr) library(tidyverse) # 你的原始长格式数据 d_long <- data.frame( nameid = c("sally","sally","sally","Robert","annie","annie"), value = c("product1","ra","ent","ra","ra","product1") ) # 执行转换 d_exist <- d_long %>% pivot_wider( id_cols = nameid, # 按nameid分组 names_from = value, # 把value列的取值转成新的列名 values_from = value, # 基于value列生成值 values_fn = ~1, # 只要存在对应取值就标记为1 values_fill = 0 # 不存在的取值填充为0 ) # 查看结果 print(d_exist)
运行后就能得到和你示例完全一致的DataFrame啦。
方法2:用data.table的dcast(适合大数据,速度更快)
如果你要处理的数据集很大,data.table包的dcast函数效率会更高,语法也很简洁:
# 加载data.table包 library(data.table) # 把原始数据转成data.table格式 setDT(d_long) # 执行转换 d_exist <- dcast(d_long, nameid ~ value, fun.aggregate = length, fill = 0) # 查看结果 print(d_exist)
这里fun.aggregate = length是统计每个nameid对应value的出现次数(因为每个组合最多出现一次,结果就是1或0),fill = 0用来填充不存在的组合。
方法3:基础R的table函数(无需额外装包)
如果不想加载任何第三方包,用基础R的table函数也能实现:
# 生成交叉频数表 tab <- table(d_long$nameid, d_long$value) # 把频数表转成DataFrame,并整理格式 d_exist <- as.data.frame.matrix(tab) d_exist$nameid <- rownames(d_exist) d_exist <- d_exist[, c("nameid", colnames(tab))] # 调整列顺序,让nameid在最前面 # 查看结果 print(d_exist)
table函数会直接生成行是nameid、列是value取值的交叉表,转成矩阵后再转成DataFrame,最后把行名转成nameid列即可。
这三种方法都能达到你的需求,你可以根据自己的使用习惯和数据规模来选择~
内容的提问来源于stack exchange,提问作者user8831872
相关产品推荐
相关产品推荐

