向数据帧中的每个组添加行时如何将 `cur_data()` 替换为 `pick()`

luc*_*ews 4 r dplyr

我发现该dplyr函数cur_data()已被弃用,取而代之的是pick(). pick()但是,当尝试将行添加到分组数据框中的每个组时,我对如何使用感到困惑。我正在清理一些奇怪的数据,需要将行插入到每个组中,以传播分组变量的值,同时将特定值插入到随附的列中。

\n

这是用于cur_data()生成我想要的输出的示例代码:

\n
df <- tibble::tribble(\n  ~id,   ~val,\n  "A",   95,\n  "A",   20,\n  "A",   45,\n  "B",   10,\n  "B",   50,\n  "C",   80\n)\n\ndf_new_rows <- df |>\n  dplyr::group_by(id) |>\n  dplyr::reframe(tibble::add_row(dplyr::cur_data(), val = 100)) |>\n  dplyr::ungroup()\n
Run Code Online (Sandbox Code Playgroud)\n

100这是所需的输出 - 列中的行val已被插入:

\n
# A tibble: 9 \xc3\x97 2\n  id      val\n  <chr> <dbl>\n1 A        95\n2 A        20\n3 A        45\n4 A       100\n5 B        10\n6 B        50\n7 B       100\n8 C        80\n9 C       100\n
Run Code Online (Sandbox Code Playgroud)\n

我如何使用pick()或其他功能来做到这一点?出于开发原因,我想使用基础Rtidyverse函数,但如果没有办法做到这一点,我愿意接受其他建议。预先感谢您的任何帮助!

\n

小智 6

您可以使用group_modify()将函数应用于分组 tibble 中的每个组,并返回分组 tibble。

df <- tibble::tibble(
 id = c("A", "A", "A", "B", "B", "C"),
 val = c(95, 20, 45, 10, 50, 80)
)

add_row_func <- function(df) {
 tibble::add_row(df, id = df$id[1], val = 100)
}

df_new_rows <- df |>
 dplyr::group_by(id) |>
 dplyr::group_modify(add_row_func) |>
 dplyr::ungroup()

print(df_new_rows)
Run Code Online (Sandbox Code Playgroud)