将名称相似的不等长列表元素转换为数据帧R

use*_*230 2 r list dplyr

我知道数据框问题列表很多,但是我找不到解决这个简单问题的方法。可以说我有:

library(tidyverse)
library(janitor)
df <- data.frame( group = c(rep("A",3), rep("B", 6)),
                  test_value = c(0,1,2, 0,1,2,3,4,5))
df_list <- df %>% 
  split(.$group) %>% 
  map(~tabyl(.x$test_value))
df_list  
# $A
#  .x$test_value n   percent
#              0 1 0.3333333
#              1 1 0.3333333
#              2 1 0.3333333

# $B
#  .x$test_value n   percent
#              0 1 0.1666667
#              1 1 0.1666667
#              2 1 0.1666667
#              3 1 0.1666667
#              4 1 0.1666667
#              5 1 0.1666667
Run Code Online (Sandbox Code Playgroud)

我要做的就是将其转换为以下命名数据框:

  A_test_value   A_n A_percent B_test_value   B_n B_percent
         <dbl> <dbl>     <dbl>        <dbl> <dbl>     <dbl>
1            0     1     0.333            0     1     0.167
2            1     1     0.333            1     1     0.167
3            2     1     0.333            2     1     0.167
4           NA    NA    NA                3     1     0.167
5           NA    NA    NA                4     1     0.167
6           NA    NA    NA                5     1     0.167
Run Code Online (Sandbox Code Playgroud)

我已经看到了,但这有点不同(将嵌套列表(长度不等)转换为数据框

请问有人可以快速解决(也许是dplyr类型)吗?

H 1*_*H 1 5

也许您想加入?

library(dplyr)
library(purrr)
library(janitor)

df %>% 
  group_split(group) %>% 
  map(~tabyl(.x, test_value)) %>%
  reduce(full_join, by = "test_value")

  test_value n.x percent.x n.y percent.y
1          0   1 0.3333333   1 0.1666667
2          1   1 0.3333333   1 0.1666667
3          2   1 0.3333333   1 0.1666667
4          3  NA        NA   1 0.1666667
5          4  NA        NA   1 0.1666667
6          5  NA        NA   1 0.1666667
Run Code Online (Sandbox Code Playgroud)

对于表示组的命名输出,您可以执行以下操作:

df %>% 
  split(.$group) %>%
  map(~tabyl(.x, test_value)) %>%
  imap(~set_names(.x, ifelse(names(.x) != "test_value", paste(.y, names(.x), sep = "_"), names(.x)))) %>%
  reduce(full_join, by = "test_value")

  test_value A_n A_percent B_n B_percent
1          0   1 0.3333333   1 0.1666667
2          1   1 0.3333333   1 0.1666667
3          2   1 0.3333333   1 0.1666667
4          3  NA        NA   1 0.1666667
5          4  NA        NA   1 0.1666667
6          5  NA        NA   1 0.1666667
Run Code Online (Sandbox Code Playgroud)