Regex 将字符串拆分为列

Regex 将字符串拆分为列,regex,r,string,strsplit,Regex,R,String,Strsplit,我有一列有点混乱的值 Col1 ---------------------------------------- B-Lipotropin(S)...............874 BTETLS IgE-Dandelion(S).............4578 BTETLS Beta Gamma-Globulin..........2807 BTETLS Lactate, P Phospholipid .........8296 BTETLS 如何像

我有一列有点混乱的值

   Col1
   ----------------------------------------
   B-Lipotropin(S)...............874 BTETLS
   IgE-Dandelion(S).............4578 BTETLS
   Beta Gamma-Globulin..........2807 BTETLS
   Lactate, P
   Phospholipid .........8296 BTETLS
如何像这样将这些值拆分为三列

    Col1                        Col2         Col3
    -----------------------------------------------
    B-Lipotropin(S)             874          BTETLS
    IgE-Dandelion(S)            4578         BTETLS
    Beta Gamma-Globulin         2807         BTETLS
    Lactate, P
    Phospholipid                8296         BTETLS

谢谢你的帮助

没有实际数据,很难给出一个通用的解决方案。然而,下面是一个使用正则表达式的例子

在这里,我假设前两列总是由至少一个
分隔,可能在前面或后面有空格;第二列和第三列可能由空格分隔

dat <- read.table(text="B-Lipotropin(S)...............874 BTETLS
IgE-Dandelion(S).............4578 BTETLS
Beta Gamma-Globulin..........2807 BTETLS
Lactate, P
Phospholipid .........8296 BTETLS",
sep=";", stringsAsFactors=F)

# separate first column
l <- strsplit(dat[,1], split="[[:space:]]*\\.+[[:space:]]*")
l <- lapply(l, function(x) c(x,rep("",2-length(x))))
l <- do.call(rbind,l)

dat <- cbind(dat, l[,1])

# separate last two columns
l <- strsplit(l[,2], split="[[:space:]]+")
l <- lapply(l, function(x) c(x,rep("",2-length(x))))
l <- do.call(rbind,l)

dat <- cbind(dat, l)
colnames(dat) <- c("original","col1","col2","col3")

使用带正则表达式的base R在正确的位置拆分字符串

setNames(as.data.frame(                                         # coerce to data.frame
    do.call(rbind,                                              # bind list
            lapply(
                strsplit(dat$Col1, "\\.+|[0-9]+(?= )", perl=T), # split messy string
                `length<-`, 3)                                  # normalize lengths of lists
            )
), paste0("Col", 1:3))                                          # add column names

#                  Col1 Col2   Col3
# 1     B-Lipotropin(S)  874 BTETLS
# 2    IgE-Dandelion(S) 4578 BTETLS
# 3 Beta Gamma-Globulin 2807 BTETLS
# 4          Lactate, P <NA>   <NA>
# 5       Phospholipid  8296 BTETLS
setNames(如.data.frame(#强制为data.frame
do.call(rbind,#绑定列表
拉普拉(
strsplit(dat$Col1,\\.+[0-9]+(?=)”,perl=T),拆分凌乱的字符串

`长度您也可以使用
tidyr
进行此操作:

library(tidyr)

dat <- read.table(text="B-Lipotropin(S)...............874 BTETLS
IgE-Dandelion(S).............4578 BTETLS
Beta Gamma-Globulin..........2807 BTETLS
Lactate, P
Phospholipid .........8296 BTETLS",
sep=";", stringsAsFactors=F, col.names = 'Col1')

dat %>%
  separate(Col1, c('Col1', 'Col2'), '\\.+', extra = 'drop') %>%
  separate(Col2, c('Col2', 'Col3'), ' ', extra = 'drop')

#                                    Col1 Col2   Col3
# 1                       B-Lipotropin(S)  874 BTETLS
# 2                      IgE-Dandelion(S) 4578 BTETLS
# 3                   Beta Gamma-Globulin 2807 BTETLS
# 4                            Lactate, P <NA>   <NA>
# 5                         Phospholipid  8296 BTETLS
library(tidyr)
dat%
单独(Col1,c('Col1','Col2'),'\\.+',额外='drop')%>%
单独(Col2,c('Col2','Col3'),'',额外='drop')
#Col1 Col2 Col3
#1 B-脂托品(S)874 BTETLS
#2 IgE蒲公英(S)4578 BTETLS
#3β-丙种球蛋白2807 BTETL
#4乳酸,P
#5磷脂8296 BTETL
编辑:您也可以使用
分离(Col1,paste0('Col',1:3),'([^,])|(\\.+)',额外='drop')一步完成编辑

您能给数据一个dput()吗?
library(tidyr)

dat <- read.table(text="B-Lipotropin(S)...............874 BTETLS
IgE-Dandelion(S).............4578 BTETLS
Beta Gamma-Globulin..........2807 BTETLS
Lactate, P
Phospholipid .........8296 BTETLS",
sep=";", stringsAsFactors=F, col.names = 'Col1')

dat %>%
  separate(Col1, c('Col1', 'Col2'), '\\.+', extra = 'drop') %>%
  separate(Col2, c('Col2', 'Col3'), ' ', extra = 'drop')

#                                    Col1 Col2   Col3
# 1                       B-Lipotropin(S)  874 BTETLS
# 2                      IgE-Dandelion(S) 4578 BTETLS
# 3                   Beta Gamma-Globulin 2807 BTETLS
# 4                            Lactate, P <NA>   <NA>
# 5                         Phospholipid  8296 BTETLS