2015-07-21 71 views
2

我是有點亂分裂串入列

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 

感謝所有幫助值的列。

+1

你可以給你的數據的dput()? – jeremycg

回答

5

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

編輯:你也可以做到在一個步驟separate(Col1, paste0('Col', 1:3), '([^,])|(\\.+)', extra = 'drop')

+0

@ssdecontrol,這工作完美:) –

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

使用基礎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