2016-09-18 50 views
0

我试图如下: *从合并列在DF 提取字符模式与*提取模式 创建DF列*从合并栏中删除抽取的图形如何将数据帧列设置为R中的可提取模式?

比方说你有这个例子中数据帧

Col1 <- c("a1 b1 c1","a2 b2 c2","a3 b3 c3","a4 b4 c4") 
dat <- data.frame(Col1) 
dat 

     Col1 
    1 a1 b1 c1 
    2 a2 b2 c2 
    3 a3 b3 c3 
    4 a4 b4 c4 

你怎么可以提取含有“A”到另一列,然后从Col1中的元素中的所有元素来获得:

dat 

    Col1 Col2 
    1 b1 c1 a1 
    2 b2 c2 a2 
    3 b3 c3 a3 
    4 b4 c4 a4 

我一直在使用R中的stringr包并使用str_extract来提取模式。有没有办法将数据框列设置为要在合并列中替换的模式?

+0

正则表达式可以做很多事情。你可以学习和尝试在线regex测试网站,如regex101.com你可以看到你的正则表达式的解释,轻松地测试正则表达式的结果。 – dracodoc

回答

1

一个选项将提取的“a”后面数字与str_extract(从stringr)和人物与sub的休息和营造data.frame

library(stringr) 
data.frame(Col1 = sub("^\\S+\\s+", "", dat$Col1), Col2=str_extract(dat$Col, "a\\d+")) 
# Col1 Col2 
#1 b1 c1 a1 
#2 b2 c2 a2 
#3 b3 c3 a3 
#4 b4 c4 a4 

还是一个base R方法假设在字符串的开始处出现'a'后面跟着数字(\\d+),我们使用sub来匹配'a'后跟一个或多个数字,将它作为一个组((a\\d+))捕获,然后再加上一个空格(\\s+),然后第二个捕获组与其余字符((.*)。我们用由,分隔的捕获组反向引用替换它。这可以在read.table/read.csv中用于创建新的data.frame。

read.table(text=sub("(a\\d+)\\s+(.*)", "\\1,\\2", dat$Col1), 
     sep=",", col.names=c("Col1", "Col2"), stringsAsFactors=FALSE) 

或者与extracttidyr

library(tidyr) 
extract(dat, Col1, into = c("Col1", "Col2"), "(a\\d+)\\s+(.*)") 
0

这工作

a.pat <- ([a]{1})([0-9]{1}) # Identify/create pattern to be extracted 

dat$Col2 <- str_extract(dat$Col1,a.pat) # Create a new column with extracted pattern 

# Now we will seperate and convert Col2 into a pattern 
Col2.pat <- as.list(dat$Col2) # Separate column pattern from df as list 
Col2.pat <- as.character(Col2.pat) # set Col2 as a character string 

dat$Col1 <- str_replace(dat$Col1,Col2.pat,"") # Remove element from merged column