映射列表列并提取第一个列表项
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
遍历 list
、if
和 [=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
我有如下数据:
# 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
遍历 list
、if
和 [=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