如何基于time和type两列将R数据框转为宽格式?解决报错问题
问题原因
你的报错是因为原始数据中,ptid、num、time、type的组合存在重复记录(比如ptid=1、num=1、time=1、type=type1对应两行不同的volume值),pivot_wider无法自动确定该用哪个值填充宽格式的单元格,因此抛出“无法唯一识别volume对应的值”的错误。
解决方案
根据你的需求,有几种处理方式:
1. 对重复值进行聚合(推荐)
如果重复行是合理的(比如同一分组下的多次测量),可以通过values_fn指定聚合规则,比如取均值、求和、保留第一个值等:
df_wide <- df %>% pivot_wider( names_from = c(time, type), values_from = volume, names_prefix = "time", names_sep = "", values_fn = mean # 可替换为sum、first、last等你需要的函数 )
2. 保留所有重复值(存储为列表)
如果需要保留同一分组下的所有volume值,可以让宽格式的单元格存储列表:
df_wide <- df %>% pivot_wider( names_from = c(time, type), values_from = volume, names_prefix = "time", names_sep = "", values_fn = list )
3. 先去重再转换
如果重复行是数据错误导致的,先通过distinct去重再转换宽格式:
df_wide <- df %>% distinct(ptid, num, time, type, .keep_all = TRUE) %>% pivot_wider( names_from = c(time, type), values_from = volume, names_prefix = "time", names_sep = "" )
以上三种方式都能生成你需要的time1type1、time2type1这类列名。
内容的提问来源于stack exchange,提问作者Rstudyer
相关产品推荐
相关产品推荐

