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
相关产品推荐
相关产品推荐

