我尝试以下方法: *从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
如何提取包含&#34; a&#34;的所有元素?到另一列,然后从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 :(得分:1)
一种选择是提取&#39; a&#39;其次是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
或假设{&#39;后面跟着数字(base R
)出现在字符串的开头,我们使用\\d+
来匹配&#39; a&#39;后跟一个或多个数字,将其捕获为一个组(sub
),然后再捕获一个空格((a\\d+)
),然后将第二个捕获组捕获为其余字符(\\s+
) 。我们将其替换为由(.*
分隔的捕获组的反向引用。这可以在,
中用于创建新的data.frame。
read.table/read.csv
或read.table(text=sub("(a\\d+)\\s+(.*)", "\\1,\\2", dat$Col1),
sep=",", col.names=c("Col1", "Col2"), stringsAsFactors=FALSE)
extract
tidyr
答案 1 :(得分: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