如何将单个列中的内容拆分为R中的两个单独列?

时间:2015-02-04 08:54:19

标签: regex r dataframe

我的数据框中有一列:

Colname
20151102
19920311
20130204
>=70
60-69
20-29

我希望将此列拆分为两列,如:

Col1         Col2
20151102
19920311
20130204
            >=70
            60-69
            20-29

如何实现这一结果?

3 个答案:

答案 0 :(得分:3)

一种可能的解决方案,想法是使用extract中的tidyr。请注意,我选择的分隔符(点)不得出现在您的初始data.frame

library(magrittr)
library(tidyr)

df$colname = df$colname %>% 
             grepl("[>=|-]+", .) %>% 
             ifelse(paste0(".", df$colname), paste0(df$colname, ".")) 

extract(df, colname, c("col1","col2"), "(.*)\\.(.*)")
#     col1  col2
#1  222222      
#2 1111111      
#3          >=70
#4         60-69
#5         20-29

数据:

df = data.frame(colname=c("222222","1111111",">=70","60-69","20-29"))

答案 1 :(得分:3)

无需任何包装:

df[,c("Col1", "Col2")] <- ""

isnum <- suppressWarnings(!is.na(as.numeric(df$colname)))

df$Col1[isnum] <- df$colname[isnum]
df$Col2[!isnum] <- df$colname[!isnum]

df <- df[,!(names(df) %in% "colname")]

数据:

df = data.frame(colname=c("20151102","19920311","20130204",">=70","60-69","20-29"), stringsAsFactors=FALSE)

答案 2 :(得分:1)

这是一个单一的声明解决方案。 read.pattern分别在括号括起的正则表达式部分中捕获两种字段类型。如果format列已经是类Colname,则可以省略"character"。此外,如果希望第一列是数字,则省略colClasses参数。)

library(gsubfn)
read.pattern(text = format(DF$Colname), pattern = "(^\\d+$)|(.*)", 
                   col.names = c("Col1", "Col2"), colClasses = "character")

,并提供:

      col1     col2
1 20151102         
2 19920311         
3 20130204         
4          >=70    
5          60-69   
6          20-29 

注意:以下是使用的正则表达式的可视化:

(^\d+$)|(.*)

Regular expression visualization

Debuggex Demo