如何将数据帧列设置为R中的可提取模式



我正在尝试以下操作:*从df中的合并列中提取字符模式*使用提取的模式创建df列*从合并列中删除提取的模式

假设你有这个例子的数据帧

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来提取模式。有没有办法将数据帧列设置为要在合并列中替换的模式?

一个选项是提取"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中用于创建新的数据帧。

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

或使用tidyr 中的extract

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

这适用于

 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

相关内容

  • 没有找到相关文章

最新更新