Приведение строки к вектору - PullRequest
0 голосов
/ 26 апреля 2018

Я пытаюсь создать калькулятор, который умножает группы перестановок, записанные в циклической форме (процесс, который описан в этом посте, для тех, кто незнаком: 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 голосов
/ 28 апреля 2018

Вы можете использовать chartr с read.table:

read.table(text= chartr("()"," \n",x))
#   V1 V2 V3
# 1  1  2  3
# 2  2  4  1
0 голосов
/ 26 апреля 2018

альтернатива: использование 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
0 голосов
/ 26 апреля 2018

На самом деле нет скаляров на R. Одиночные значения, такие как 1, TRUE и "a", являются векторами из 1 элемента.grep(pattern, x) отлично подойдет для вашей исходной строки.В качестве отправной точки для достижения желаемой цели я бы предложил разделить группы, используя:

> str_extract_all(x, "\\([0-9 ]+\\)")
[[1]]
[1] "(1 2 3)" "(2 4 1)"
0 голосов
/ 26 апреля 2018

Если нам нужно разделить строки скобками

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)"
0 голосов
/ 26 апреля 2018

Комментарии в коде.

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...