映射列表列并提取第一个列表项

map over list columns and extract the first list item

我有如下数据:

# A tibble: 6 × 2
  `Total_ Española_Porcentaje` `Total_ Extranjero_Porcentaje`
  <list>                       <list>                        
1 <dbl [3]>                    <dbl [3]>                     
2 <dbl [3]>                    <dbl [3]>                     
3 <dbl [3]>                    <dbl [3]>                     
4 <dbl [3]>                    <dbl [3]>                     
5 <dbl [3]>                    <dbl [3]>                     
6 <dbl [3]>                    <dbl [3]> 

我正在尝试使用 map 映射列并提取第一个 dbl

我试过了

df %>%
  map_dbl(., ~if(length(.x)) .x[1] else NA)

df %>%
  imap_dfc(., function(x, y) 
    tibble(!!y := map_dbl(x, ~if(length(.x)) .x[1] else NA)))

但我无法让它工作。

Data <- structure(list(`Total_ Española_Porcentaje` = list(c(5.9, 5.9, 
5.9), c(5.9, 5.9, 5.9), c(5.9, 5.9, 5.9), c(5.9, 5.9, 5.9), c(5.9, 
5.9, 5.9), c(5.9, 5.9, 5.9)), `Total_ Extranjero_Porcentaje` = list(
    c(5.9, 5.9, 5.9), c(5.9, 5.9, 5.9), c(5.9, 5.9, 5.9), c(5.9, 
    5.9, 5.9), c(5.9, 5.9, 5.9), c(5.9, 5.9, 5.9))), row.names = c(NA, 
-6L), class = c("tbl_df", "tbl", "data.frame"))

我们可以使用 across 遍历 list 列,然后 map 遍历 listif 和 [=17] 的元素=] 大于 0,select first 元素或 else returns NA

library(dplyr)
library(purrr)
Data %>%
      mutate(across(everything(), 
       ~ map_dbl(., ~ if(length(.x) ) first(.x) else NA)))
# A tibble: 6 x 2
  `Total_ Española_Porcentaje` `Total_ Extranjero_Porcentaje`
                         <dbl>                          <dbl>
1                          5.9                            5.9
2                          5.9                            5.9
3                          5.9                            5.9
4                          5.9                            5.9
5                          5.9                            5.9
6                          5.9                            5.9

或受@ThomasIsCoding

启发
map_dfr(Data, map_dbl, first)
# A tibble: 6 x 2
  `Total_ Española_Porcentaje` `Total_ Extranjero_Porcentaje`
                         <dbl>                          <dbl>
1                          5.9                            5.9
2                          5.9                            5.9
3                          5.9                            5.9
4                          5.9                            5.9
5                          5.9                            5.9
6                          5.9                            5.9

基础 R 技巧

> Data[] <- lapply(Data, sapply, `[`, 1)
> Data
# A tibble: 6 x 2
  `Total_ Espa±ola_Porcentaje` `Total_ Extranjero_Porcentaje`
                         <dbl>                          <dbl>
1                          5.9                            5.9
2                          5.9                            5.9
3                          5.9                            5.9
4                          5.9                            5.9
5                          5.9                            5.9
6                          5.9                            5.9

也许我们可以使用 purrr 包中的 pluck

pluck() 实现了 [[ 的通用形式,允许您深入灵活地索引数据结构。 https://purrr.tidyverse.org/reference/pluck.html

library(purrr)
pluck(Data, 1)

输出:

 pluck(2,2)
[1] 5.9 5.9 5.9
> pluck(Data,1)
[[1]]
[1] 5.9 5.9 5.9

[[2]]
[1] 5.9 5.9 5.9

[[3]]
[1] 5.9 5.9 5.9

[[4]]
[1] 5.9 5.9 5.9

[[5]]
[1] 5.9 5.9 5.9

[[6]]
[1] 5.9 5.9 5.9