Разбить строку на два подшаблона в data.frame - PullRequest
1 голос
/ 09 апреля 2019

У меня есть вектор символов:

s <- "0 / 10 %(% 1 / 11 %-% 2 / 12 %)% 3 / 13"

Цель состоит в том, чтобы разделить его на / и %*% на (x, y) точки и z символов:

data.frame(x = c(0,1,2,3), y = c(10,11,12,13), z = c("(", "-", ")", NA),
           stringsAsFactors = FALSE)
  x  y    z
1 0 10    (
2 1 11    -
3 2 12    )
4 3 13 <NA>

Примечания:

  • / разделяет точки: я хочу разделить x / y на x -часть и y -часть.
  • Второйsplit %*% должен идти в столбец z символов, но без %;

Я пробовал различные версии strsplit безуспешно:

trimws(unlist(strsplit(s, "[/(%*%)]")))
[1] "0" "0" ""  ""  "1" "1" "-" "2" "2" ""  ""  "3" "3"

Проблемы :

  • - не попадает (%*%), почему?
  • У меня есть пустые части строки,почему?
  • Понятия не имею, как сохранить split в столбце z 1041 *

Ответы [ 2 ]

2 голосов
/ 09 апреля 2019

Это решит вашу проблему:


str <- "0 / 10 %(% 1 / 11 %-% 2 / 12 %)% 3 / 13"

str_sub <- gsub("[%/]","",str) #sub all % and / with ""
str_split <- strsplit(str_sub,"\\s+")[[1]] #split by whitespace
str_corr <- c(str_split,rep(NA,3-length(str_split) %% 3)) #correct length, fill the end with NAs

df <- as.data.frame(matrix(str_corr,ncol=3,byrow=TRUE)) #convert to data.frame via matrix
colnames(df) <- c("x","y","z") #set colnames

Создано в 2019-04-09 пакетом представ. (v0.2.1)

К вашему первому выпуску:

  1. %*% не захватывает -, потому что вы просите регулярное выражение повторить % 0 или более раз (с *), но не запрашивает -.
1 голос
/ 09 апреля 2019

Это неуловимо, потому что strsplit(s, '%[(-)]%') отбрасывает ваши шаблоны разделения, что было бы хорошо для '/', но не для захвата среднего символа между процентами.Если вы гарантируете, что после правильного процента есть пробел, вы можете просто выполнить strsplit (s, '%');в противном случае вам понадобится регулярное выражение с правосторонним утверждением для цифр.

Проще и понятнее сделать два разбиения: сделайте первый разбивку на процентах '%':

s2 <- strsplit(s, '% ')[[1]]

"0 / 10 %(" "1 / 11 %-" "2 / 12 %)" "3 / 13"

Теперь вы делаете второе разделение на символы '/' и символы левого процента:

> strsplit(s2, '[%/]')

[[1]]
[1] "0 "   " 10 " "("   

[[2]]
[1] "1 "   " 11 " "-"   

[[3]]
[1] "2 "   " 12 " ")"   

[[4]]
[1] "3 "  " 13"

Небольшая проблема с этим, он рваный;последняя строка не имеет символа.Поскольку в вашем случае кажется безопасным предположить, что это происходит только в конце строки, самый простой способ - добавить символ конца строки '% $%' (обратите внимание на завершающий пробел), а затем отобразить $ -> NA.позже.

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