在R语言中替换字符串的方法是什么?

3

我应该如何在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("dag|[{} ]","","dag{D<-{G}; A<-{D}; A<-{G}; A<-{Q}}") 可能会用到方括号。 - zx8754
5个回答

2

这对你来说好吗?

gsub(pattern = "dag|\\{|\\}|[[:space:]]", replacement = "", x = "dag{D<-{G}; A<-{D}; A<-{G}; A<-{Q}}")

1
作为 dag格式,我们可以使用专门的包进行导入:
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()

enter image description here


1
这使得所有事情变得最简单,酷!点赞! - ThomasIsCoding

1
我们可以尝试。
> 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]
)

such that

> g
IGRAPH 9786b7a DN-- 4 4 --
+ attr: name (v/c)
+ edges from 9786b7a (vertex names):
[1] G->D D->A G->A Q->A

enter image description here


1
使用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"

本文于2021年8月31日由reprex包 (v2.0.0)创建


0
这是一个正则表达式查找所有匹配边缘关系的方法:
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"

这个答案非常健壮,因为它不假设任何关于图边界的文本。相反,它只匹配边缘,然后剥离花括号。


如果它们的节点名称为d、a、g,则此方法将无法正常工作。请尝试使用"dag{d<-{g}; A<-{D}; A<-{G}; A<-{Q}}"。 - zx8754
@zx8754 这是一个边缘情况,并不包含在问题中的示例数据中,而且也很容易修复。我们可以使用不区分大小写的正则表达式搜索,或者使用 [A-Za-z]+ 进行匹配。 - Tim Biegeleisen
好的,输入是一个DAG格式,以单词“dag”开头,我们需要匹配该单词,而不是单词中的字母,然后删除花括号和空格。实际数据中,节点很可能具有字母d、a、g。 - zx8754
@zx8754 哇,听起来 dag 可能会变成一个真正的“狗”。 - Tim Biegeleisen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接