将字符串拆分为

时间:2015-07-21 22:46:26

标签: 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                        Col2         Col3
    -----------------------------------------------
    B-Lipotropin(S)             874          BTETLS
    IgE-Dandelion(S)            4578         BTETLS
    Beta Gamma-Globulin         2807         BTETLS
    Lactate, P
    Phospholipid                8296         BTETLS

感谢任何帮助。

3 个答案:

答案 0 :(得分:5)

您也可以使用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

separate(Col1, paste0('Col', 1:3), '([^,] )|(\\.+)', extra = 'drop')

修改:您也可以使用Image

一步完成

答案 1 :(得分:2)

如果没有实际数据,很难给出一般解决方案。但是,下面是一个使用正则表达式。

这里我假设前两列总是至少有一个.,前后可能有空格;据推测,第二和第三列用空格分隔。

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")

分隔的列如下所示:

> dat[,-1]
                 col1 col2   col3
1     B-Lipotropin(S)  874 BTETLS
2    IgE-Dandelion(S) 4578 BTETLS
3 Beta Gamma-Globulin 2807 BTETLS
4          Lactate, P            
5        Phospholipid 8296 BTETLS

答案 2 :(得分:2)

使用带有正则表达式的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