我正在尝试创建一个计算器,用于将以循环形式编写的排列组相乘(本文中描述的过程适用于任何不熟悉的人:https://math.stackexchange.com/questions/31763/multiplication-in-permutation-groups-written-in-cyclic-notation)。虽然我知道使用Python或其他东西会更容易,但我想练习在R中编写代码,因为它对我来说相对较新。
我的游戏计划是输入,例如“(1 2 3)(2 4 1)”并将其分成两个单独的列表或向量。但是,我在开始这个时遇到了麻烦,因为我对字符函数的理解(我在这里研究过:https://www.statmethods.net/management/functions.html)我最终必须使用函数grep()来找到“)(”发生在我身上的点从那里拆分的字符串。但是,grep只为其参数提供了向量,所以我试图将我的字符串强制转换为向量。在研究这个问题时,我大多数人都建议使用as.integer(unlist(str_split()) )),然而,这对我来说不起作用,因为当我分裂时,并非所有内容都是整数,并且值变为NA,如本示例所示。
library(tidyverse)
x <- "(1 2 3)(2 4 1)"
x <- as.integer(unlist(str_split(x," ")))'
x
当不仅涉及整数时,是否有另一种方法将字符串转换为向量?我也意识到我试图分割这两种排列的方法非常迂回,但这是因为我研究过的字符函数似乎是唯一的方法。如果还有其他功能可以让这更容易,请告诉我。
谢谢!
答案 0 :(得分:3)
代码中的评论。
x <- "(1 2 3)(2 4 1)"
out1 <- strsplit(x, split = ")(", fixed = TRUE)[[1]] # split on close and open bracket
out2 <- gsub("[\\(|\\)]", replacement = "", out1) # remove brackets
out3 <- strsplit(out2, " ") # tease out numbers between spaces
lapply(out3, as.integer)
[[1]]
[1] 1 2 3
[[2]]
[1] 2 4 1
答案 1 :(得分:0)
R上没有任何标量。1
,TRUE
和"a"
等单个值都是1元素向量。 grep(pattern, x)
可以正常使用原始字符串。作为实现预期目标的起点,我建议使用以下方式拆分组:
> str_extract_all(x, "\\([0-9 ]+\\)")
[[1]]
[1] "(1 2 3)" "(2 4 1)"
答案 2 :(得分:0)
如果我们需要用括号分割字符串
strsplit(x, "(?<=\\))(?=\\()", perl = TRUE)[[1]]
#[1] "(1 2 3)" "(2 4 1)"
或者我们可以使用来自qdapRegex
library(qdapRegex)
ex_round(x, include.marker = TRUE)[[1]]
#[1] "(1 2 3)" "(2 4 1)"
答案 3 :(得分:0)
替代方案:使用library(magrittr)
x <- "(1 2 3)(2 4 1)"
x %>%
gsub("^\\(","c(",.) %>% gsub("\\)\\(","),c(",.) %>% gsub("(?=\\s\\d)",", ",.,perl=T) %>%
paste0("list(",.,")") %>% {eval(parse(text=.))}
结果:
# [[1]]
# [1] 1 2 3
#
# [[2]]
# [1] 2 4 1
答案 4 :(得分:0)
您可以将chartr
与read.table
:
read.table(text= chartr("()"," \n",x))
# V1 V2 V3
# 1 1 2 3
# 2 2 4 1