Вы можете сделать это с помощью separate_rows
и некоторого последующего изменения формы.separate_rows
переводит вещи в длинный формат, поэтому мы можем выполнить некоторую фильтрацию, а затем spread
, чтобы получить желаемый результат:
library(tidyverse)
tbl <- read_table2(
"ID age location
1 83 country=X;province=A;city=J
2 15 country=X;city=K
3 2 country=Y;province=B;city=I
4 12 country=X;city=L
5 2 country=Y;city=J
6 2 country=Y;province=A;city=M
7 18 country=X;province=B;city=J
8 85 country=X;province=A;city=I"
)
tbl %>%
separate_rows(location, sep = ";") %>%
separate(location, c("location_type", "value")) %>%
filter(location_type %in% c("country", "city")) %>%
spread(location_type, value)
#> # A tibble: 8 x 4
#> ID age city country
#> <dbl> <dbl> <chr> <chr>
#> 1 1 83 J X
#> 2 2 15 K X
#> 3 3 2 I Y
#> 4 4 12 L X
#> 5 5 2 J Y
#> 6 6 2 M Y
#> 7 7 18 J X
#> 8 8 85 I X
Поскольку у вас есть только два случая, вы можете найти их быстрееили проще просто использовать регулярное выражение для непосредственного извлечения интересующих значений:
tbl %>%
mutate(
country = str_extract(location, "(?<=country\\=)."),
city = str_extract(location, "(?<=city\\=).")
)
#> # A tibble: 8 x 5
#> ID age location country city
#> <dbl> <dbl> <chr> <chr> <chr>
#> 1 1 83 country=X;province=A;city=J X J
#> 2 2 15 country=X;city=K X K
#> 3 3 2 country=Y;province=B;city=I Y I
#> 4 4 12 country=X;city=L X L
#> 5 5 2 country=Y;city=J Y J
#> 6 6 2 country=Y;province=A;city=M Y M
#> 7 7 18 country=X;province=B;city=J X J
#> 8 8 85 country=X;province=A;city=I X I
Создано в 2019-02-25 пакетом Представить (v0.2.1)