如何用tidyverse为tibble各分组的非分组列添加额外行?
如何为数据框中每个id分组的非分组列添加额外行
你需要为每个id分组生成包含原行,以及day=原day-1、station=原station-1的额外行,最终得到预期的6行数据。以下是可行的解决方案:
方法一:使用reframe生成分组内的多行数据
reframe可以在每个分组内生成多行结果,直接构造出我们需要的两行数据:
library(tidyverse) df <- tibble(id = c("A", "B", "C"), day = c(3, 1, 2), station = c(10, 9, 2)) df %>% group_by(id) %>% reframe( day = c(day - 1, day), station = c(station - 1, station) ) %>% arrange(id, day)
运行结果与预期一致:
# A tibble: 6 × 3 id day station <chr> <dbl> <dbl> 1 A 2 9 2 A 3 10 3 B 0 8 4 B 1 9 5 C 1 1 6 C 2 2
方法二:生成额外行后与原数据合并
先构造每个分组的额外行,再和原数据绑定后排序:
# 生成每个id对应的额外行 extra_rows <- df %>% mutate( day = day - 1, station = station - 1 ) # 合并并排序 bind_rows(extra_rows, df) %>% arrange(id, day)
关于你之前尝试的问题说明
- 使用
complete(day = (day -1):day)时,仅会扩展day列的取值范围,但station列没有对应的填充逻辑,因此会出现NA值。 mutate(across(c("day", "station"), complete((.x - 1):.x)))的写法错误,因为complete是数据框级别的行生成函数,不能嵌套在用于修改列值的mutate中。
内容的提问来源于stack exchange,提问作者medium-dimensional
相关产品推荐
相关产品推荐

