Разделение вывода текстового файла на два вектора - PullRequest
0 голосов
/ 26 апреля 2018

Итак, у меня есть вывод

"[(9.010658025741577, 2.8047988414764404), (9.242822885513306, 2.66866397857666), (9.263759851455688, 2.6707050800323486), (9.515105962753296, 2.5500648021698)]"

Я использую команду:

read_txt_file <- scan("my_file.txt", what="", sep="\n") 

Теперь я хочу разделить вывод на два вектора, чтобы он был:

x = "[9.010658025741577, 9.242822885513306, 9.263759851455688, 9.515105962753296]" 

и

y= "[ 2.8047988414764404, 2.66866397857666, 2.6707050800323486), 2.5500648021698)]"

Есть идеи, как это легко сделать?Благодарю.

Ответы [ 3 ]

0 голосов
/ 26 апреля 2018

Я предполагаю, что ваш x является объединением каждой первой координаты вектора и y второй.

Предположим, у вас есть такой вывод.

output <- "[(9.010658025741577, 2.8047988414764404), (9.242822885513306, 2.66866397857666), (9.263759851455688, 2.6707050800323486), (9.515105962753296, 2.5500648021698)]"

Вы можете сделать следующее.

clean_output <- gsub("\\[|\\]|\\(|\\)", "", output) # remove brackets and parenthesis
coord_mat <- matrix(unlist(strsplit(clean_output, ", ")),ncol = 2, byrow = T)
# retrieve coordinates as a matrix arranged the way you like
x <- paste0("[", paste(coord_mat[,1], collapse = ", "), "]")
y <- paste0("[", paste(coord_mat[,2], collapse = ", "), "]")
0 голосов
/ 26 апреля 2018

Вы можете попробовать следующее:

#Loading text
text <- "[(9.010658025741577, 2.8047988414764404), (9.242822885513306, 2.66866397857666), (9.263759851455688, 2.6707050800323486), (9.515105962753296, 2.5500648021698)]"

#Extracting the numbers from the string and creating a tbl_df
text <- text %>% 
  stringr::str_match_all("[0-9]+") %>%
  unlist() %>% 
  as.numeric() %>% 
  tbl_df()

#Creating new tbl_df for odd and even 
EvenNumbers <- text[floor(text$value) %% 2 == 0, ] 
OddNumbers <- text[floor(text$value) %% 2 == 1, ] 
0 голосов
/ 26 апреля 2018

Вы можете попробовать это:

text1 <- "[(9.010658025741577, 2.8047988414764404), (9.242822885513306, 2.66866397857666), (9.263759851455688, 2.6707050800323486), (9.515105962753296, 2.5500648021698)]"


x <- paste0("[",paste0(c(unlist(strsplit(gsub("[^0-9\\.\\,]", "", text1), ",")))[seq(1,7,2)], collapse = ", "), "]")
y <- paste0("[",paste0(c(unlist(strsplit(gsub("[^0-9\\.\\,]", "", text1), ",")))[seq(2,8,2)], collapse = ", "), "]")


> x
[1] "[9.010658025741577, 9.242822885513306, 9.263759851455688, 9.515105962753296]"
> y
[1] "[2.8047988414764404, 2.66866397857666, 2.6707050800323486, 2.5500648021698]"

С помощью команды gsub вы сохраняете только цифры, десятичные точки и запятые.Впоследствии вы разбиваете строку на подстроки с запятой в качестве разделителя.Затем вы удаляете эти подстроки и помещаете их в вектор.Для х вы сохраняете неравные элементы, а для у четные элементы.Затем вы вставляете все элементы в x (а также в y), устанавливая collapse = "," в команде paste0.Наконец, вы вставляете «[» в начале и «]» в конце.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...