我有以下数据框架:
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
和用0填充val
。期望的结果是:
id pos val
foo 1 10
foo 2 5
foo 3 1
bar 1 0
bar 2 0
bar 3 13
如何用tidyr complete()实现?
我试过了,但是没有成功:
dat %>%
group_by(id) %>%
complete(pos, fill = list(val = 0))
可以使用嵌套完成:
正如Darren Tsai在评论中指出的那样,只需要包括pos变量-使用嵌套是不必要的。
dat <- tribble(~id, ~pos, ~val,
"foo", 1, 10,
"foo", 2, 5,
"foo", 3, 1,
"bar", 3, 13)
dat %>%
complete(id, pos, fill = list(val = 0))
# A tibble: 6 × 3
id pos val
<chr> <dbl> <dbl>
1 bar 1 0
2 bar 2 0
3 bar 3 13
4 foo 1 10
5 foo 2 5
6 foo 3 1
如果将数据分组,complete
应用于每一组;所以你要做的是:
dat %>% complete(id, pos, fill = list(val = 0))
给出所有id
-pos
的组合,并用零填充缺失的val
。