在R语言中使用dcast结合条件语句重塑数据框的问题
解决方案:将sales数据框转换为指定宽格式
我来帮你搞定这个问题!你想要把长格式的sales数据转成按cust_id分组、每个prod_id作为列的宽格式,并且用0/1标记该客户是否购买过对应产品(atm>0为1,否则0)。核心思路是先把atm转换为0/1标记,再进行宽表转换,下面给你两种常用的实现方法:
方法1:使用data.table的dcast函数(你提到的工具)
如果你习惯用dcast,可以先预处理atm列,再用dcast完成转换:
# 先安装并加载data.table(如果还没装的话) # install.packages("data.table") library(data.table) # 第一步:给sales添加0/1购买标记列 sales$purchase_flag <- as.integer(sales$atm > 0) # 用dcast转换为宽格式 sales_wide <- dcast( data = sales, formula = cust_id ~ prod_id, # 行是cust_id,列是prod_id value.var = "purchase_flag", # 用我们刚生成的标记列填充 fun.aggregate = max # 同一客户同一产品可能有多条记录,取最大值(只要有一次购买就记1) )
方法2:使用tidyverse的pivot_wider(tidy风格)
如果你更熟悉tidyverse生态,用pivot_wider会更直观:
# 安装并加载tidyr和dplyr(如果还没装的话) # install.packages("tidyverse") library(tidyr) library(dplyr) sales_wide <- sales %>% # 生成0/1购买标记 mutate(purchase_flag = as.integer(atm > 0)) %>% # 转换为宽格式 pivot_wider( id_cols = cust_id, # 行分组依据 names_from = prod_id, # 列名来源 values_from = purchase_flag,# 填充值的来源 values_fill = 0, # 客户未购买的产品填充0 values_fn = list(purchase_flag = max) # 处理重复记录,取最大值 )
为什么之前用dcast没成功?
你之前尝试直接在dcast里加条件语句会比较复杂,不如先把atm转换成我们需要的0/1标记列,再用dcast或者pivot_wider处理,逻辑更清晰,也更容易调试。
运行上面的代码后,你就能得到和示例格式一致的宽表啦!
内容的提问来源于stack exchange,提问作者kwang yoon
相关产品推荐
相关产品推荐

