无法向分组数据框添加行

Tar*_*Jae 6 r dataframe dplyr tibble

这是如何将行添加到仅修改某些列的数据帧的后续问题。

解决这个问题后,我想将 stefan 提供的解决方案应用到更大的数据框group_by

我的数据框:

df <- structure(list(test_id = c(1, 1, 1, 1, 1, 1, 1, 1), test_nr = c(1, 
1, 1, 1, 2, 2, 2, 2), region = c("A", "B", "C", "D", "A", "B", 
"C", "D"), test_value = c(3, 1, 1, 2, 4, 2, 4, 1)), class = "data.frame", row.names = c(NA, 
-8L))

  test_id test_nr region test_value
1       1       1      A          3
2       1       1      B          1
3       1       1      C          1
4       1       1      D          2
5       1       2      A          4
6       1       2      B          2
7       1       2      C          4
8       1       2      D          1

Run Code Online (Sandbox Code Playgroud)

我现在想使用以下代码向每个组添加一个新行,这会出现错误:

df %>%
  group_by(test_nr) %>% 
  add_row(test_id = .$test_id[1], test_nr = .$test_nr[1], region = "mean", test_value = mean(.$test_value))

Error: Can't add rows to grouped data frames.
Run `rlang::last_error()` to see where the error occurred.
  
Run Code Online (Sandbox Code Playgroud)

我的预期输出是:

   test_id test_nr region test_value
1        1       1      A       3.00
2        1       1      B       1.00
3        1       1      C       1.00
4        1       1      D       2.00
5        1       1   MEAN       1.75
6        1       2      A       4.00
7        1       2      B       2.00
8        1       2      C       4.00
9        1       2      D       1.00
10       1       2   MEAN       2.75
Run Code Online (Sandbox Code Playgroud)

到目前为止我已经尝试过:

library(tidyverse)

df %>%
  group_by(test_nr) %>% 
  group_split() %>% 
  map_dfr(~ .x %>% 
            add_row(!!! map(.[4], mean)))

   test_id test_nr region test_value
     <dbl>   <dbl> <chr>       <dbl>
 1       1       1 A            3   
 2       1       1 B            1   
 3       1       1 C            1   
 4       1       1 D            2   
 5      NA      NA NA           1.75
 6       1       2 A            4   
 7       1       2 B            2   
 8       1       2 C            4   
 9       1       2 D            1   
10      NA      NA NA           2.75

Run Code Online (Sandbox Code Playgroud)

如何修改第 1 列到第 3 列以将我的值放在那里?

Mik*_*ila 5

事实上,我最近为此做了一个小辅助函数。用于group_modify()获取组数据的想法,以及bind_rows()使用 计算的汇总统计数据summarise()

\n

代码如下:

\n
add_summary_rows <- function(.data, ...) {\n  group_modify(.data, function(x, y) bind_rows(x, summarise(x, ...)))\n}\n
Run Code Online (Sandbox Code Playgroud)\n

这里\xe2\x80\x99s 是如何处理你的数据的:

\n
library(dplyr, warn.conflicts = FALSE)\n\ndf <- data.frame(\n  test_id = c(1, 1, 1, 1, 1, 1, 1, 1),\n  test_nr = c(1, 1, 1, 1, 2, 2, 2, 2),\n  region = c("A", "B", "C", "D", "A", "B", "C", "D"),\n  test_value = c(3, 1, 1, 2, 4, 2, 4, 1)\n)\n\ndf %>% \n  group_by(test_id, test_nr) %>% \n  add_summary_rows(\n    region = "MEAN",\n    test_value = mean(test_value)\n  )\n#> # A tibble: 10 x 4\n#> # Groups:   test_id, test_nr [2]\n#>    test_id test_nr region test_value\n#>      <dbl>   <dbl> <chr>       <dbl>\n#>  1       1       1 A            3   \n#>  2       1       1 B            1   \n#>  3       1       1 C            1   \n#>  4       1       1 D            2   \n#>  5       1       1 MEAN         1.75\n#>  6       1       2 A            4   \n#>  7       1       2 B            2   \n#>  8       1       2 C            4   \n#>  9       1       2 D            1   \n#> 10       1       2 MEAN         2.75\n
Run Code Online (Sandbox Code Playgroud)\n