2015-07-21 3 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 
Смежные вопросы