簡體   English   中英

R:如何從列中刪除嵌套列表?

[英]R: How to remove nested lists from columns?

我正在尋找從帶有列表的 tibble 中刪除嵌套列表列。 例如,在下面的列表中,我想刪除“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的 output

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

或者可以使用collapse中的atomic_elem

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM