String Разделение столбца на несколько столбцов - PullRequest
0 голосов
/ 08 декабря 2018

Привет, у меня есть вопрос, касающийся программирования R, я новичок в R. У меня есть набор данных в Excel с определенным столбцом, имеющим значения как таковые.

123456
123456789
123456789123

Теперь мое требование - получить значения вкратно 3 и разделить на разные столбцы.Например,Моя первая строка будет разбита на 2 столбца, а вторая строка на 3 столбца

colA colB colC
123  456
123  456  789

Желаемый результат:

enter link description here

Ответы [ 4 ]

0 голосов
/ 08 декабря 2018

Вот один вариант с separate

library(tidyverse)
df %>% 
  separate(a, into = c('b', 'c', 'd'), sep= c(3, 6), remove = FALSE)
#          a   b   c   d
#1       123 123        
#2    123456 123 456    
#3 123456789 123 456 789

Использование convert=TRUE, автоматически изменяет type столбца

df %>% 
   separate(a, into = c('b', 'c', 'd'), sep= c(3, 6), 
          remove = FALSE, convert = TRUE)

data

df <- data.frame (a = c(123,123456,123456789))
0 голосов
/ 08 декабря 2018

Вот несколько решений.Первые 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)
0 голосов
/ 08 декабря 2018

с использованием библиотеки data.table

library(data.table)
setDT(df1)
df1[, tstrsplit(df1$col1, "(?:.{3}+\\K)", perl = TRUE)] # change {3} to other numbers if you don't want to split after every 3.

#    V1  V2   V3   V4
#1: 123 456 <NA> <NA>
#2: 123 456  789 <NA>
#3: 123 456  789  123

data:

df1<-
structure(list(col1 = c("123456", "123456789", "123456789123"
)), class = c("data.table", "data.frame"), row.names = c(NA, -3L))
0 голосов
/ 08 декабря 2018

Вероятно, есть метод, который предполагает меньше повторений, но один из вариантов может быть

library(tidyverse)

df <- data.frame (a = c(123,123456,123456789))

df %>%
  mutate(b = substr(a, 0,3),
         c = substr(a, 4,6),
         d = substr(a, 7,9))

          a   b   c   d
1       123 123        
2    123456 123 456    
3 123456789 123 456 789
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...