R, отдельные столбцы, разделенные запятыми. больше разделений, чем на столбцы

#r #dplyr

Вопрос:

возможно ли с помощью dplyr и separate создавать новые строки, если разделение создает больше значений, чем указано в столбцах «в»?

т.е.

 df <- data.frame(values = c("1,2,3,4,5,6"))
sep <- separate(
    data = df,
    col = values,
    into = c("Part1", "Part2", "Part3"),
    sep = ","
)

sep
Part1 Part2 Part3
1     2     3
 

ожидаемый результат выглядит следующим образом

 sep
Part1 Part2 Part3
1     2     3
4     5     6
 

Ответ №1:

1) Замените запятую точкой с запятой после каждого третьего числа, разделите на строки, а затем разделите на поля.

 library(dplyr)
library(tidyr)

df %>%
  mutate(values = gsub("(\d ,\d ,\d ),", "\1;", values)) %>%
  separate_rows(values, sep = ";") %>%
  separate(values, into = paste0("Part", 1:3), convert = TRUE)
 

дающий:

 # A tibble: 2 x 3
  Part1 Part2 Part3
  <int> <int> <int>
1     1     2     3
2     4     5     6
 

2) Поочередно заменяйте запятую после каждого третьего поля новой строкой, а затем используйте read.table для ее чтения.

 library(dplyr)

df$values %>%
  gsub("(\d ,\d ,\d ),", "\1n", .) %>%
  read.table(text = ., sep = ",", col.names = paste0("Part", 1:3))
 

дающий:

   Part1 Part2 Part3
1     1     2     3
2     4     5     6
 

3) Вариант (2) состоит в том, чтобы отсканировать его, преобразовать в матрицу, а затем в фрейм данных и добавить имена столбцов.

 df$values %>%
  scan(text = ., sep = ",", quiet = TRUE) %>%
  matrix(ncol = 3, byrow = TRUE) %>%
  as.data.frame %>%
  setNames(paste0("Part", 1:ncol(.)))
 

дающий:

   Part1 Part2 Part3
1     1     2     3
2     4     5     6