首页 > 解决方案 > 映射列表列并提取第一个列表项

问题描述

我有以下数据,如下所示:

# 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"))

标签: rdataframepurrr

解决方案


我们可以使用across循环遍历list列,然后遍历的map元素,list大于0,选择元素或返回 NAiflengthfirstelse

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

推荐阅读