使用 purrr 或 across 与 mutate 根据条件生成列

nic*_*las 1 r dplyr purrr

关于使用purrr包函数的问题有很多mutate,但我还没有找到一个可以应用于我的特定情况的问题,其中涉及条件函数。这是一个玩具数据框的示例:

\n
library(dplyr)\n\ndf <- tibble(year = c("2018", "2018", "2019", "2019"), \n             observed = c("YES", "NO", "NO", "YES"))\n\n
Run Code Online (Sandbox Code Playgroud)\n

这是所需的输出:

\n
df %>% mutate(observed_2018 = if_else(observed == "YES" & year == "2018", 1, 0), \n              observed_2019 = if_else(observed == "YES" & year == "2019", 1, 0))\n#> # A tibble: 4 \xc3\x97 4\n#>   year  observed observed_2018 observed_2019\n#>   <chr> <chr>            <dbl>         <dbl>\n#> 1 2018  YES                  1             0\n#> 2 2018  NO                   0             0\n#> 3 2019  NO                   0             0\n#> 4 2019  YES                  0             1\n
Run Code Online (Sandbox Code Playgroud)\n

如何使用函数(或者, )以编程方式生成observed_2018observed_2019purrracross()

\n

Dar*_*sai 5

您可以使用map_dfc()列绑定每年的输出并使用 解除列表列的嵌套tidyr::unnest()

\n
library(dplyr)\nlibrary(purrr)\n\ndf %>%\n  mutate(obs = map_dfc(set_names(2018:2019), ~ +(observed == "YES" & year == .x))) %>%\n  tidyr::unnest(obs, names_sep = \'_\')\n
Run Code Online (Sandbox Code Playgroud)\n

如果您不想使用额外的包 ( ),您可以只对和原始数据tidyr的输出进行列绑定。map_dfcdf

\n
bind_cols(\n  df,\n  map_dfc(2018:2019, ~ transmute(df, \'obs_{.x}\' := +(observed == "YES" & year == .x)))\n)\n
Run Code Online (Sandbox Code Playgroud)\n

的替代方案map来自reduce()同一包。

\n
reduce(2018:2019,\n  ~ mutate(.x, \'obs_{.y}\' := +(observed == "YES" & year == .y)), .init = df\n)\n
Run Code Online (Sandbox Code Playgroud)\n
\n
输出
\n
# # A tibble: 4 \xc3\x97 4\n#   year  observed obs_2018 obs_2019\n#   <chr> <chr>       <int>    <int>\n# 1 2018  YES             1        0\n# 2 2018  NO              0        0\n# 3 2019  NO              0        0\n# 4 2019  YES             0        1\n
Run Code Online (Sandbox Code Playgroud)\n