关于使用purrr包函数的问题有很多mutate,但我还没有找到一个可以应用于我的特定情况的问题,其中涉及条件函数。这是一个玩具数据框的示例:
library(dplyr)\n\ndf <- tibble(year = c("2018", "2018", "2019", "2019"), \n observed = c("YES", "NO", "NO", "YES"))\n\nRun Code Online (Sandbox Code Playgroud)\n这是所需的输出:
\ndf %>% 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\nRun Code Online (Sandbox Code Playgroud)\n如何使用函数(或者, )以编程方式生成observed_2018和observed_2019?purrracross()
您可以使用map_dfc()列绑定每年的输出并使用 解除列表列的嵌套tidyr::unnest()。
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 = \'_\')\nRun Code Online (Sandbox Code Playgroud)\n如果您不想使用额外的包 ( ),您可以只对和原始数据tidyr的输出进行列绑定。map_dfcdf
bind_cols(\n df,\n map_dfc(2018:2019, ~ transmute(df, \'obs_{.x}\' := +(observed == "YES" & year == .x)))\n)\nRun Code Online (Sandbox Code Playgroud)\n的替代方案map来自reduce()同一包。
reduce(2018:2019,\n ~ mutate(.x, \'obs_{.y}\' := +(observed == "YES" & year == .y)), .init = df\n)\nRun Code Online (Sandbox Code Playgroud)\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\nRun Code Online (Sandbox Code Playgroud)\n