使用Tidyr扩展含多键/值的数据表遇问题求解决方案
解决方法
你的问题核心是spread会将除key和value之外的所有列作为分组依据,只要这些列存在不同值,就会生成多行结果。以下是几种简单可行的处理方式:
1. 先筛选必要列再扩展
如果原数据表Have里有多余的列(比如无关的ID、时间戳等),先只保留Group和Number列再执行扩展:
Want = Have |> select(Group, Number) |> spread(key = Group, value = Number)
2. 先汇总重复分组再扩展
如果需要保留其他列(比如用户ID),但同一分组下存在多个Number值,先对Number做汇总(求和/均值等)再扩展:
Want = Have |> group_by(需要保留的列名, Group) |> summarise(Number = sum(Number), .groups = "drop") |> # sum可替换为mean/max等 spread(key = Group, value = Number)
3. 推荐使用pivot_wider替代spread
spread是tidyr的旧版函数,现已被更灵活的pivot_wider取代,写法更清晰且兼容性更好:
# 筛选列后扩展 Want = Have |> select(Group, Number) |> pivot_wider(names_from = Group, values_from = Number) # 带保留列+汇总的写法 Want = Have |> group_by(需要保留的列名, Group) |> summarise(Number = sum(Number), .groups = "drop") |> pivot_wider(names_from = Group, values_from = Number)
内容的提问来源于stack exchange,提问作者user2899944
相关产品推荐
相关产品推荐

