Вот несколько решений.Первые 5 не используют никаких пакетов.nc
(количество столбцов) и cn
(имена столбцов), определенные в (1), также используются в других.
1) read.fwf Использование ввода DF
, показанный воспроизводимым образом в примечании, в конце подсчитайте максимальное количество символов в строке и разделите на 3, чтобы получить количество столбцов nc
.Затем вычислите имена столбцов cn
.Наконец, используйте read.fwf
, чтобы прочитать их. Пакеты не используются.
nc <- max(nchar(DF[[1]]))/3
cn <- paste0("col", head(LETTERS, nc))
read.fwf(textConnection(as.character(DF[[1]])), rep(3, length = nc),
col.names = cn)
, дающий:
colA colB colC colD
1 123 456 NA NA
2 123 456 789 NA
3 123 456 789 123
2) formatC Вариант вышеупомянутогоиспользовать formatC
для вставки запятых после каждых 3 символов, дающих вектор символов ch
, а затем прочитать это, используя read.csv
.
ch <- formatC(DF[[1]], format= "f", digits = 0, big.mark = ",")
read.csv(text = ch, header = FALSE, col.names = cn)
3) strsplit Еще один вариантбудет разделять столбец, используя strsplit
и указанное регулярное выражение для разделения, а затем использовать toString, чтобы поместить компоненты разделения в вектор строки, разделенный запятыми, ch
.Наконец, используйте read.csv
, как и раньше.
ch <- sapply(strsplit(as.character(DF[[1]]), "(?<=...)", perl = TRUE), toString)
read.csv(text = ch, header = FALSE, col.names = cn)
4) gsub Еще одним вариантом является использование gsub
для вставки запятых через каждые 3 символа, а затем используйте read.csv
как в (2) и (3).
ch <- gsub("(...)(?=.)", "\\1,", DF[[1]], perl = TRUE)
read.csv(text = ch, header = FALSE, col.names = cn)
5) strcapture Этот метод не использует никаких операций чтения. *.Он также использует только базу R.
strcapture(strrep("(...)?", nc), DF[[1]], setNames(double(nc), cn))
6) strapplyc Это единственный вариант, в котором используется пакет.strapplyc
может использоваться для выбора последовательных трехсимвольных подмножеств.Он использует более простое регулярное выражение, чем некоторые другие наши решения.read.csv
используется как в некоторых других решениях.
library(gsubfn)
ch <- sapply(strapplyc(DF[[1]], "..."), toString)
read.csv(text = ch, header = FALSE, col.names = cn)
Примечание
Ввод в воспроизводимой форме:
Lines <- "
123456
123456789
123456789123"
DF <- read.table(text = Lines)