Используя dplyr
и tidyr
, мы можем сделать (см. Примечание ниже):
df %>%
mutate(across(2:3,~gsub('\\[|\\]|"',"",as.character(.)))) %>%
tidyr::separate_rows(2:3, sep=",") # need to automate this, maybe use selectors? or -1?
col1 col2 col3
1 a 1 A
2 a 2 B
3 a 3 C
4 b 1 A
5 b 2 C
6 c 4 D
7 c 4 E
ПРИМЕЧАНИЕ :
- Я используя версию разработчика
dplyr(0.8.9.9000)
. Вы можете использовать mutate_at
вместо mutate(across...)
- Вам нужно автоматизировать манипуляции, либо использовать -1, либо другой селектор вместо 2: 3. Это чисто для этого примера.
Данные :
df<- structure(list(col1 = structure(1:3, .Label = c("a", "b", "c"
), class = "factor"), col2 = structure(c(2L, 1L, 3L), .Label = c("[\"1\",\"2\"]",
"1,2,3", "4"), class = "factor"), col3 = structure(1:3, .Label = c("A,B,C",
"A,C", "D,E"), class = "factor")), class = "data.frame", row.names = c(NA,
-3L))