You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

R语言如何使用tidyr包complete()补全数据并填充缺失值为0

问题场景

现有测试数据框如下:

library(tidyverse)
dat <- tribble(~id, ~pos, ~val, 
          "foo", 1, 10,
          "foo", 2, 5,
          "foo", 3, 1, 
          "bar", 3, 13)

已知每个id对应的pos取值范围固定为1-3,需要补全所有id下缺失的pos记录,缺失行的val统一填充为0,期望得到的结果如下:

id      pos   val
 foo       1    10
 foo       2     5
 foo       3     1
 bar       1     0
 bar       2     0
 bar       3    13

尝试编写的代码未达到预期效果:

dat  %>% 
  group_by(id) %>% 
  complete(pos, fill = list(val = 0))
错误原因

complete()默认只会用数据中实际存在的变量值做组合补全,分组后bar组内的pos仅出现过3,因此不会自动补全1、2两个位置的记录,必须显式指定pos的完整取值范围。

正确写法

不需要提前分组,直接在complete()中显式声明两个列的组合规则即可:

dat %>% 
  complete(id, pos = 1:3, fill = list(val = 0))

如果需要保留分组逻辑做后续操作,也可以在分组后显式指定pos的取值范围,运行完记得取消分组:

dat %>% 
  group_by(id) %>% 
  complete(pos = 1:3, fill = list(val = 0)) %>%
  ungroup()

运行以上任意一段代码都能得到期望的输出结果。


内容的提问来源于stack exchange,提问作者littleworth

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 03:42:17