对于 tidyverse 方法,试试这个:
library(dplyr)
library(tidyr)
df <- structure(list(id = c(
"1", "2", "3", "4", "5", "1", "2", "10",
"6", "7", "14", "2", "8", "9", "16", "10", "11", "7", "12", "13",
"3", "14", "15", "1", "2", "9"
), code = c(
"EP", "EP", "EP", "UM",
"UM", "UM", "UM", "UM", "BZ", "BZ", "BZ", "BZ", "TVOL", "TVOL",
"TVOL", "NW", "NW", "NW", "SM", "SM", "SM", "GS", "GS", "GS",
"GS", "GS"
)), row.names = c(NA, -26L), class = c(
"tbl_df", "tbl",
"data.frame"
))
df %>%
pivot_wider(id_cols = "id", names_prefix = "code.", names_from = "code", values_from = "code") %>%
mutate_at(vars(starts_with("code")), ~ ifelse(!is.na(.x), TRUE, FALSE))
#> # A tibble: 16 x 8
#> id code.EP code.UM code.BZ code.TVOL code.NW code.SM code.GS
#> <chr> <lgl> <lgl> <lgl> <lgl> <lgl> <lgl> <lgl>
#> 1 1 TRUE TRUE FALSE FALSE FALSE FALSE TRUE
#> 2 2 TRUE TRUE TRUE FALSE FALSE FALSE TRUE
#> 3 3 TRUE FALSE FALSE FALSE FALSE TRUE FALSE
#> 4 4 FALSE TRUE FALSE FALSE FALSE FALSE FALSE
#> 5 5 FALSE TRUE FALSE FALSE FALSE FALSE FALSE
#> 6 10 FALSE TRUE FALSE FALSE TRUE FALSE FALSE
#> 7 6 FALSE FALSE TRUE FALSE FALSE FALSE FALSE
#> 8 7 FALSE FALSE TRUE FALSE TRUE FALSE FALSE
#> 9 14 FALSE FALSE TRUE FALSE FALSE FALSE TRUE
#> 10 8 FALSE FALSE FALSE TRUE FALSE FALSE FALSE
#> 11 9 FALSE FALSE FALSE TRUE FALSE FALSE TRUE
#> 12 16 FALSE FALSE FALSE TRUE FALSE FALSE FALSE
#> 13 11 FALSE FALSE FALSE FALSE TRUE FALSE FALSE
#> 14 12 FALSE FALSE FALSE FALSE FALSE TRUE FALSE
#> 15 13 FALSE FALSE FALSE FALSE FALSE TRUE FALSE
#> 16 15 FALSE FALSE FALSE FALSE FALSE FALSE TRUE