R中分组行的嵌套列表

vlurs2pr  于 2023-01-15  发布在  其他
关注(0)|答案(4)|浏览(127)

我有下面的嵌套列表l(下面的dput):

> l
$A
$A$`1`
[1] 1 2 3

$A$`2`
[1] 3 2 1

$B
$B$`1`
[1] 2 2 2

$B$`2`
[1] 3 4 3

我想将其转换为分组 Dataframe ,其中A和B是第一个分组列,12是具有各自值的子组。

group subgroup values
1      A        1      1
2      A        1      2
3      A        1      3
4      A        2      3
5      A        2      2
6      A        2      1
7      B        1      2
8      B        1      2
9      B        1      2
10     B        2      3
11     B        2      4
12     B        2      3

正如你所看到的,A和B是主组,12是子组,使用purrr::flatten(l)unnest是不起作用的,所以我想知道是否有人知道如何将嵌套列表转换为分组行 Dataframe ?
dput/l:

l <- list(A = list(`1` = c(1, 2, 3), `2` = c(3, 2, 1)), B = list(`1` = c(2, 
2, 2), `2` = c(3, 4, 3)))
6ojccjat

6ojccjat1#

使用 stack 和rowbind,ID为:

data.table::rbindlist(lapply(l, stack), idcol = "id")
#     id values ind
#  1:  A      1   1
#  2:  A      2   1
#  3:  A      3   1
#  4:  A      3   2
#  5:  A      2   2
#  6:  A      1   2
#  7:  B      2   1
#  8:  B      2   1
#  9:  B      2   1
# 10:  B      3   2
# 11:  B      4   2
# 12:  B      3   2
gblwokeq

gblwokeq2#

您可以使用enframe()将列表转换为data.frame,并使用unnestvalue列转换两次。

library(tidyr)

tibble::enframe(l, name = "group") %>%
  unnest_longer(value, indices_to = "subgroup") %>%
  unnest(value)

# A tibble: 12 × 3
   group value subgroup
   <chr> <dbl> <chr>   
 1 A         1 1       
 2 A         2 1       
 3 A         3 1       
 4 A         3 2       
 5 A         2 2       
 6 A         1 2       
 7 B         2 1       
 8 B         2 1       
 9 B         2 1       
10 B         3 2       
11 B         4 2       
12 B         3 2
ccgok5k5

ccgok5k53#

将列表直接转换为数据框,然后将其透视为长格式,并按所需顺序进行arrange操作。

library(tidyverse)

lst %>% 
  as.data.frame() %>% 
  pivot_longer(everything(), names_to = c("group", "subgroup"), 
               values_to = "values", 
               names_pattern = "(.+?)\\.(.+?)") %>% 
  arrange(group, subgroup)

# A tibble: 12 × 3
   group subgroup values
   <chr> <chr>     <dbl>
 1 A     1             1
 2 A     1             2
 3 A     1             3
 4 A     2             3
 5 A     2             2
 6 A     2             1
 7 B     1             2
 8 B     1             2
 9 B     1             2
10 B     2             3
11 B     2             4
12 B     2             3
lqfhib0f

lqfhib0f4#

您可以将rrapplyunnest结合使用,这样做的好处是可以处理任意长度的列表:

library(rrapply)
library(tidyr)
rrapply(l, how = "melt") |>
  unnest(value)

# A tibble: 12 × 3
   L1    L2    value
   <chr> <chr> <dbl>
 1 A     1         1
 2 A     1         2
 3 A     1         3
 4 A     2         3
 5 A     2         2
 6 A     2         1
 7 B     1         2
 8 B     1         2
 9 B     1         2
10 B     2         3
11 B     2         4
12 B     2         3

相关问题