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)