Как разделить столбец фрейма данных, который является словарем, на два столбца

#r #data-manipulation

Вопрос:

У меня есть фрейм данных со столбцом, таким как

ID колонка словаря
1 {1:5, 10:15, 3:9}
2 {3:4, 5:3}

и я пытаюсь сделать так, чтобы это выглядело:

ID col_a col_b
1 1 5
1 10 15
1 3 9
2 3 4
2 5 3

Есть какие-нибудь советы по этому поводу? Вы использовали различные методы stringr , но всегда теряете столбец идентификаторов или заканчиваете запутанными и медленными циклами. Спасибо

Комментарии:

1. Пожалуйста, предоставьте воспроизводимые данные, вставив выходные данные из dput(your_dataframe) .

Ответ №1:

tidyverse Подход к достижению желаемого результата может выглядеть так:

 library(dplyr) library(tidyr)  data.frame(  ID = c(1L, 2L),  dictionary_column = c("{1:5, 10:15, 3:9}", "{3:4, 5:3}") ) %>%  mutate(dictionary_column = gsub("(\{|\})", "", dictionary_column)) %>%  separate_rows(dictionary_column, sep = ", ") %>%  separate(dictionary_column, into = c("col_a", "col_b")) #> # A tibble: 5 × 3 #> ID col_a col_b #> <int> <chr> <chr> #> 1 1 1 5  #> 2 1 10 15  #> 3 1 3 9  #> 4 2 3 4  #> 5 2 5 3  

Ответ №2:

Опция с str_extract_all извлечением цифр до и после : в list столбцы unnest , а затем list

 library(stringr) library(dplyr) library(tidyr) df1 %>%  mutate(col_a = str_extract_all(dictionary_column, "\d (?=:)"),  col_b = str_extract_all(dictionary_column, "(?<=:)\d "),   .keep = "unused") %>%   unnest(c(col_a, col_b))  

-выход

 # A tibble: 5 × 3  ID col_a col_b  <int> <chr> <chr> 1 1 1 5  2 1 10 15  3 1 3 9  4 2 3 4  5 2 5 3   

данные

 df1 <- structure(list(ID = 1:2, dictionary_column = c("{1:5, 10:15, 3:9}",  "{3:4, 5:3}")), class = "data.frame", row.names = c(NA, -2L))  

Ответ №3:

Не очень элегантно, но это работает:

 library(tidyr) library(dplyr)  dat %>%   mutate(dictionary_column = gsub("\{|\}|\,", "", dictionary_column)) %>%   separate(dictionary_column, into=c("a", "b", "c"), sep=" ") %>%   pivot_longer(-ID, values_drop_na=T) %>%   select(-name) %>%   separate(value, into = c("col_a", "col_b"))  
 # A tibble: 5 × 3  ID col_a col_b  <int> <chr> <chr> 1 1 1 5  2 1 10 15  3 1 3 9  4 2 3 4  5 2 5 3