Разделить строки в столбце и вставить как новые строки для 2 столбцов - PullRequest
1 голос
/ 20 марта 2020

У меня есть фрейм данных, похожий на этот.

col1    col2        col3
a        1,2,3      A,B,C 
b        ["1","2"]  A,C
c        4          D,E

Желаемый вывод:

col1  col2 col3
a      1    A
a      2    B
a      3    C 
b      1    A
b      2    C
c      4    D
c      4    E

Я пробовал это

df %>% 
  mutate((col2 = strsplit(as.character(col2), ","))&(col3 = strsplit(as.character(col3), ","))) %>% 
  unnest((col2)&(col3))

Это не сработало , Любая помощь будет оценена.

1 Ответ

1 голос
/ 20 марта 2020

Используя 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

ПРИМЕЧАНИЕ :

  1. Я используя версию разработчика dplyr(0.8.9.9000). Вы можете использовать mutate_at вместо mutate(across...)
  2. Вам нужно автоматизировать манипуляции, либо использовать -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))
...