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

Regex 如何在R中将单个列中的内容拆分为两个单独的列?,regex,r,dataframe,Regex,R,Dataframe,我的数据框中有一列: Colname 20151102 19920311 20130204 >=70 60-69 20-29 我希望将此列拆分为两列,如下所示: Col1 Col2 20151102 19920311 20130204 >=70 60-69 20-29 如何实现此结果?一种可能的解决方案是使用从tidyr提取。请注意,我选择的分隔符(点)不得出现在初始的data.frame中

我的数据框中有一列:

Colname
20151102
19920311
20130204
>=70
60-69
20-29
我希望将此列拆分为两列,如下所示:

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

如何实现此结果?

一种可能的解决方案是使用
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"))

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

给予:

      col1     col2
1 20151102         
2 19920311         
3 20130204         
4          >=70    
5          60-69   
6          20-29 
注意:这里是所用正则表达式的可视化:

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


无需任何包装:

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

如果希望作为两个独立的列,请尝试
do.call(cbind,split(df,cumsum(grepl('>',df$Colname))
。@akrun我喜欢这个。应该张贴it@DavidArenburg但是,这似乎不是希望的OP:-)或者获得所需结果的选项是
indx列也可以任意放置数据=70可以是该列的第二个条目!您应该交换
library()
调用,否则您的代码将无法工作,因为
tidyr::extract
magrittr:extract
屏蔽。这种方法看起来很有前途,可能会工作,但我无法使用tidyr。错误消息说“库中的错误(tidyr):没有名为“tidyr”的包”也许您需要先安装.packages(“tidyr”)?这种方法不会产生结果。糟糕的是,我在创建数据帧时忘记了精确
stringsAsFactors=FALSE
。现在可以了。谢谢……这就成功了:)
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)