替换 R 中的字符串 gsub
Replace string gsub in R
我如何在 R 中解析这个字符串,使其看起来像下面这样?我正在尝试通过 gsub()
通过正则表达式来做到这一点,但没有得到任何运气
输入:
"dag{D<-{G}; A<-{D}; A<-{G}; A<-{Q}}"
输出:
"D<-G;A<-D;A<-G;A<-Q"
我试过:
gsub("dag{(.*)}","","dag{D<-{G}; A<-{D}; A<-{G}; A<-{Q}}")
这对你有好处吗?
gsub(pattern = "dag|\{|\}|[[:space:]]", replacement = "", x = "dag{D<-{G}; A<-{D}; A<-{G}; A<-{Q}}")
使用 stringr
你可以试试:
str <- "dag{D<-{G}; A<-{D}; A<-{G}; A<-{Q}}"
library(stringr)
str_remove_all(str, "(dag)|[ {}]")
#> [1] "D<-G;A<-D;A<-G;A<-Q"
由 reprex package (v2.0.0)
于 2021-08-31 创建
这是一个正则表达式查找所有匹配所有边缘关系的方法:
input <- "dag{D<-{G}; A<-{D}; A<-{G}; A<-{Q}}"
output <- regmatches(input, gregexpr("[A-Z]+<-\{[A-Z]+\}", input))[[1]]
output <- paste(gsub("[{}]", "", output), collapse=";")
output
[1] "D<-G;A<-D;A<-G;A<-Q"
这个答案相当稳健,因为它没有对图边闭合周围的文本做出任何假设。相反,它只是匹配边缘,然后去掉花括号。
由于这是 dag format,我们可以使用专用包导入:
library(ggdag)
library(dagitty)
# read dag format
dag <- dag("dag{D<-{G}; A<-{D}; A<-{G}; A<-{Q}}")
dag
# dag {
# A
# D
# G
# Q
# dag
# D -> A
# G -> A
# G -> D
# Q -> A
# }
# plot
ggdag(dag) + theme_dag()
我们可以试试
> gsub("[(dag){} ]", "", "dag{D<-{G}; A<-{D}; A<-{G}; A<-{Q}}")
[1] "D<-G;A<-D;A<-G;A<-Q"
如果你想创建一个DAG,你可以使用igraph
包尝试下面的代码
g <- graph_from_data_frame(
matrix(
unlist(
regmatches(x, gregexpr("\w+", x))
)[-1],
ncol = 2, byrow = TRUE
)[, 2:1]
)
这样
> g
IGRAPH 9786b7a DN-- 4 4 --
+ attr: name (v/c)
+ edges from 9786b7a (vertex names):
[1] G->D D->A G->A Q->A
我如何在 R 中解析这个字符串,使其看起来像下面这样?我正在尝试通过 gsub()
通过正则表达式来做到这一点,但没有得到任何运气
输入:
"dag{D<-{G}; A<-{D}; A<-{G}; A<-{Q}}"
输出:
"D<-G;A<-D;A<-G;A<-Q"
我试过:
gsub("dag{(.*)}","","dag{D<-{G}; A<-{D}; A<-{G}; A<-{Q}}")
这对你有好处吗?
gsub(pattern = "dag|\{|\}|[[:space:]]", replacement = "", x = "dag{D<-{G}; A<-{D}; A<-{G}; A<-{Q}}")
使用 stringr
你可以试试:
str <- "dag{D<-{G}; A<-{D}; A<-{G}; A<-{Q}}"
library(stringr)
str_remove_all(str, "(dag)|[ {}]")
#> [1] "D<-G;A<-D;A<-G;A<-Q"
由 reprex package (v2.0.0)
于 2021-08-31 创建这是一个正则表达式查找所有匹配所有边缘关系的方法:
input <- "dag{D<-{G}; A<-{D}; A<-{G}; A<-{Q}}"
output <- regmatches(input, gregexpr("[A-Z]+<-\{[A-Z]+\}", input))[[1]]
output <- paste(gsub("[{}]", "", output), collapse=";")
output
[1] "D<-G;A<-D;A<-G;A<-Q"
这个答案相当稳健,因为它没有对图边闭合周围的文本做出任何假设。相反,它只是匹配边缘,然后去掉花括号。
由于这是 dag format,我们可以使用专用包导入:
library(ggdag)
library(dagitty)
# read dag format
dag <- dag("dag{D<-{G}; A<-{D}; A<-{G}; A<-{Q}}")
dag
# dag {
# A
# D
# G
# Q
# dag
# D -> A
# G -> A
# G -> D
# Q -> A
# }
# plot
ggdag(dag) + theme_dag()
我们可以试试
> gsub("[(dag){} ]", "", "dag{D<-{G}; A<-{D}; A<-{G}; A<-{Q}}")
[1] "D<-G;A<-D;A<-G;A<-Q"
如果你想创建一个DAG,你可以使用igraph
包尝试下面的代码
g <- graph_from_data_frame(
matrix(
unlist(
regmatches(x, gregexpr("\w+", x))
)[-1],
ncol = 2, byrow = TRUE
)[, 2:1]
)
这样
> g
IGRAPH 9786b7a DN-- 4 4 --
+ attr: name (v/c)
+ edges from 9786b7a (vertex names):
[1] G->D D->A G->A Q->A