替换 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