#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