#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