将字符串强制转换为矢量

时间:2018-04-26 05:57:10

标签: r

我正在尝试创建一个计算器,用于将以循环形式编写的排列组相乘(本文中描述的过程适用于任何不熟悉的人: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

当不仅涉及整数时,是否有另一种方法将字符串转换为向量?我也意识到我试图分割这两种排列的方法非常迂回,但这是因为我研究过的字符函数似乎是唯一的方法。如果还有其他功能可以让这更容易,请告诉我。

谢谢!

5 个答案:

答案 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上没有任何标量。1TRUE"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)

您可以将chartrread.table

一起使用
read.table(text= chartr("()"," \n",x))
#   V1 V2 V3
# 1  1  2  3
# 2  2  4  1