字符串将一列拆分为多列

时间:2018-12-08 13:09:28

标签: r

嗨,我对R编程有疑问,我是R中的新手。 我在excel中有一个数据集,其中的特定列具有这样的值。

123456
123456789
123456789123

现在,我的要求是获取3的倍数的值并分成不同的列。 例如。我的第一行将分为两列,第二行将分为三列

colA colB colC
123  456
123  456  789

所需的输出:

enter link description here

4 个答案:

答案 0 :(得分:4)

以下是一些解决方案。前5个不使用任何软件包。其他情况也使用(1)中定义的nc(列数)和cn(列名)。

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,然后使用{ {1}}。

read.csv

3)strsplit 另一种变化是使用ch <- formatC(DF[[1]], format= "f", digits = 0, big.mark = ",") read.csv(text = ch, header = FALSE, col.names = cn) 和指定的正则表达式对列进行拆分,然后使用toString将拆分的组件放入逗号分隔的字符串向量中,strsplit。最后像以前一样使用ch

read.csv

4)gsub 另一个变体是使用ch <- sapply(strsplit(as.character(DF[[1]]), "(?<=...)", perl = TRUE), toString) read.csv(text = ch, header = FALSE, col.names = cn) 每3个字符插入一个逗号,然后像在(2)和(3)中一样使用gsub

read.csv

5)捕获此命令不使用任何read。*例程。它也只使用基数R。

ch <- gsub("(...)(?=.)", "\\1,", DF[[1]], perl = TRUE)
read.csv(text = ch, header = FALSE, col.names = cn)

6)绑带。这是唯一使用包装的版本。 strcapture(strrep("(...)?", nc), DF[[1]], setNames(double(nc), cn)) 可用于选取连续的3个字符子集。它使用比我们其他解决方案更简单的正则表达式。 strapplyc与其他一些解决方案一样使用。

read.csv

注意

可复制形式的输入:

library(gsubfn)

ch <- sapply(strapplyc(DF[[1]], "..."), toString)
read.csv(text = ch, header = FALSE, col.names = cn)

答案 1 :(得分:3)

这是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)

数据

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

答案 2 :(得分:1)

使用库data.table

onResume()

数据:

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

答案 3 :(得分:0)

可能有一种方法涉及较少的重复,但是一个选择可能是

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