R:如何从列中删除嵌套列表?
R: How to remove nested lists from columns?
我想从带有列表的小标题中删除嵌套的列表列。例如,在下面的列表中,我想删除“affected_rows”而不具体引用列名。我将如何最好地解决这个问题?
my_list <- list(
a =
tibble(
code = c("ax","yz"),
affected_rows =
c(list(1:10),list(200))
),
b =
tibble(
workid = c("123","456"),
sheet = c("sheet1", "sheet2")
)
)
我们可以在遍历 list
之后使用 select
library(dplyr)
library(purrr)
my_list <- map(my_list, ~ .x %>%
select(-where(is.list)))
-输出
my_list
$a
# A tibble: 2 × 1
code
<chr>
1 ax
2 yz
$b
# A tibble: 2 × 2
workid sheet
<chr> <chr>
1 123 sheet1
2 456 sheet2
或negate
where
的输出
my_list <- map(my_list, ~.x %>%
select(negate(where(is.list))))
my_list
$a
# A tibble: 2 × 1
code
<chr>
1 ax
2 yz
$b
# A tibble: 2 × 2
workid sheet
<chr> <chr>
1 123 sheet1
2 456 sheet2
或更紧凑的选项discard
map(my_list, discard, is.list)
$a
# A tibble: 2 × 1
code
<chr>
1 ax
2 yz
$b
# A tibble: 2 × 2
workid sheet
<chr> <chr>
1 123 sheet1
2 456 sheet2
或者可以使用 atomic_elem
来自 collapse
library(collapse)
map(my_list, atomic_elem, keep.class = TRUE)
$a
# A tibble: 2 × 1
code
<chr>
1 ax
2 yz
$b
# A tibble: 2 × 2
workid sheet
<chr> <chr>
1 123 sheet1
2 456 sheet2
另一个可能的解决方案:
library(tidyverse)
map(my_list, ~ .x %>% mutate(across(where(is.list), as.null)))
#> $a
#> # A tibble: 2 × 1
#> code
#> <chr>
#> 1 ax
#> 2 yz
#>
#> $b
#> # A tibble: 2 × 2
#> workid sheet
#> <chr> <chr>
#> 1 123 sheet1
#> 2 456 sheet2
在基数 R 中:
lapply(my_list, Filter, f = Negate(is.list))
$a
# A tibble: 2 x 1
code
<chr>
1 ax
2 yz
$b
# A tibble: 2 x 2
workid sheet
<chr> <chr>
1 123 sheet1
2 456 sheet2
我想从带有列表的小标题中删除嵌套的列表列。例如,在下面的列表中,我想删除“affected_rows”而不具体引用列名。我将如何最好地解决这个问题?
my_list <- list(
a =
tibble(
code = c("ax","yz"),
affected_rows =
c(list(1:10),list(200))
),
b =
tibble(
workid = c("123","456"),
sheet = c("sheet1", "sheet2")
)
)
我们可以在遍历 list
select
library(dplyr)
library(purrr)
my_list <- map(my_list, ~ .x %>%
select(-where(is.list)))
-输出
my_list
$a
# A tibble: 2 × 1
code
<chr>
1 ax
2 yz
$b
# A tibble: 2 × 2
workid sheet
<chr> <chr>
1 123 sheet1
2 456 sheet2
或negate
where
my_list <- map(my_list, ~.x %>%
select(negate(where(is.list))))
my_list
$a
# A tibble: 2 × 1
code
<chr>
1 ax
2 yz
$b
# A tibble: 2 × 2
workid sheet
<chr> <chr>
1 123 sheet1
2 456 sheet2
或更紧凑的选项discard
map(my_list, discard, is.list)
$a
# A tibble: 2 × 1
code
<chr>
1 ax
2 yz
$b
# A tibble: 2 × 2
workid sheet
<chr> <chr>
1 123 sheet1
2 456 sheet2
或者可以使用 atomic_elem
来自 collapse
library(collapse)
map(my_list, atomic_elem, keep.class = TRUE)
$a
# A tibble: 2 × 1
code
<chr>
1 ax
2 yz
$b
# A tibble: 2 × 2
workid sheet
<chr> <chr>
1 123 sheet1
2 456 sheet2
另一个可能的解决方案:
library(tidyverse)
map(my_list, ~ .x %>% mutate(across(where(is.list), as.null)))
#> $a
#> # A tibble: 2 × 1
#> code
#> <chr>
#> 1 ax
#> 2 yz
#>
#> $b
#> # A tibble: 2 × 2
#> workid sheet
#> <chr> <chr>
#> 1 123 sheet1
#> 2 456 sheet2
在基数 R 中:
lapply(my_list, Filter, f = Negate(is.list))
$a
# A tibble: 2 x 1
code
<chr>
1 ax
2 yz
$b
# A tibble: 2 x 2
workid sheet
<chr> <chr>
1 123 sheet1
2 456 sheet2