R - 提取正则表达式组
R - Extract Regex groups
我正在处理一个数据框 df
,它的列 text
包含 "WORD"
或 "WORD, WORD2"
形式的字符串。更准确地说,这些块之前或之后可能会有一些乱码,但我知道如何处理它们。
我想使用 tidyverse 函数 extract
将两个词提取到两列 t1
和 t2
中,以便将字符串 "WORD"
提取到"WORD"
和 NA
和
- 字符串
"WORDS"
被提取到 "WORDS"
和 Na
,
- 字符串
"WORDS, WORD2"
被提取到 "WORDS"
和 "WORD2"
.
我尝试了以下形式的命令
df |> extract(x, c("1", "2"), "([^[:punct:]]+),?[[:space:]]?([^[:punct:]]*)",
remove = FALSE,
convert = TRUE)
但是,这总是将第一行读入 "WORD"
和 ""
(空字符串)。如何修改我的版本以获得所需的行为?
编辑:这是一个可能的数据帧
library(tidyverse)
df <- data.frame(x = c("123 WORD", "4564 WORD, TEST 1"))
# Expected output
df_out <- data.frame(x = c("123 WORD", "4564 WORD, TEST 1"),
t1 = c("WORD", "WORD"),
t2 = c(NA, "TEST"))
也许是这样的:
df <- data.frame(x = c("123 WORD", "4564 WORD, TEST 1"))
library(tidyverse)
df %>%
mutate(x1 = str_remove_all(x, '[0-9]*')) %>%
separate(x1, c("t1", "t2"), sep = ', ', remove = FALSE) %>%
select(-x1)
x t1 t2
1 123 WORD WORD <NA>
2 4564 WORD, TEST 1 WORD TEST
df %>%
extract(x, c('t1','t2'), '(\w+)(?:, (\w+).*)?$', FALSE) %>%
mutate(across(c(t1, t2), na_if, ''))
x t1 t2
1 123 WORD WORD <NA>
2 4564 WORD, TEST 1 WORD TEST
我正在处理一个数据框 df
,它的列 text
包含 "WORD"
或 "WORD, WORD2"
形式的字符串。更准确地说,这些块之前或之后可能会有一些乱码,但我知道如何处理它们。
我想使用 tidyverse 函数 extract
将两个词提取到两列 t1
和 t2
中,以便将字符串 "WORD"
提取到"WORD"
和 NA
和
- 字符串
"WORDS"
被提取到"WORDS"
和Na
, - 字符串
"WORDS, WORD2"
被提取到"WORDS"
和"WORD2"
.
我尝试了以下形式的命令
df |> extract(x, c("1", "2"), "([^[:punct:]]+),?[[:space:]]?([^[:punct:]]*)",
remove = FALSE,
convert = TRUE)
但是,这总是将第一行读入 "WORD"
和 ""
(空字符串)。如何修改我的版本以获得所需的行为?
编辑:这是一个可能的数据帧
library(tidyverse)
df <- data.frame(x = c("123 WORD", "4564 WORD, TEST 1"))
# Expected output
df_out <- data.frame(x = c("123 WORD", "4564 WORD, TEST 1"),
t1 = c("WORD", "WORD"),
t2 = c(NA, "TEST"))
也许是这样的:
df <- data.frame(x = c("123 WORD", "4564 WORD, TEST 1"))
library(tidyverse)
df %>%
mutate(x1 = str_remove_all(x, '[0-9]*')) %>%
separate(x1, c("t1", "t2"), sep = ', ', remove = FALSE) %>%
select(-x1)
x t1 t2
1 123 WORD WORD <NA>
2 4564 WORD, TEST 1 WORD TEST
df %>%
extract(x, c('t1','t2'), '(\w+)(?:, (\w+).*)?$', FALSE) %>%
mutate(across(c(t1, t2), na_if, ''))
x t1 t2
1 123 WORD WORD <NA>
2 4564 WORD, TEST 1 WORD TEST