如何用pick()替代已弃用的cur_data()为分组数据框添加行
问题描述
我了解到dplyr中的cur_data()函数已被弃用,官方推荐使用pick()替代,但不知道如何在分组数据框中添加行时使用pick()。我需要为每个分组插入一行,保留分组变量的值,同时在val列插入特定值100。
原使用cur_data()实现的代码如下:
df <- tibble::tribble( ~id, ~val, "A", 95, "A", 20, "A", 45, "B", 10, "B", 50, "C", 80 ) df_new_rows <- df |> dplyr::group_by(id) |> dplyr::reframe(tibble::add_row(dplyr::cur_data(), val = 100)) |> dplyr::ungroup()
预期输出:
# A tibble: 9 × 2 id val <chr> <dbl> 1 A 95 2 A 20 3 A 45 4 A 100 5 B 10 6 B 50 7 B 100 8 C 80 9 C 100
解决方案
方法1:使用pick()替代cur_data()
用pick(everything())获取当前分组的所有列(包括分组变量),结合add_row添加新行,完全替代cur_data()的作用:
df_new_rows <- df |> dplyr::group_by(id) |> dplyr::reframe( tibble::add_row(pick(everything()), val = 100) ) |> dplyr::ungroup()
方法2:group_modify结合bind_rows
通过group_modify对每个分组直接合并原数据和新增行,逻辑更直观:
df_new_rows <- df |> dplyr::group_by(id) |> dplyr::group_modify( ~ dplyr::bind_rows(.x, tibble::tibble(val = 100)) ) |> dplyr::ungroup()
其中.x代表当前分组的数据框,新增行自动继承分组变量id的值。
方法3:构造新增行后合并
无需分组操作,先提取唯一分组值构造新增行,再与原数据合并排序:
new_rows <- tibble::tibble( id = unique(df$id), val = 100 ) df_new_rows <- dplyr::bind_rows(df, new_rows) |> dplyr::arrange(id)
内容的提问来源于stack exchange,提问作者lucyandrews
相关产品推荐
相关产品推荐

