извлечение перед цифрами до и после косой черты / - PullRequest
1 голос
/ 28 марта 2019

У меня проблемы с извлечением строки до и после /.

x <- c("maximusa/b=5/1","maximusa/b=-4/1","maximusa/b=3/-2")

before_slash=sub(".*=(\\d+).*","\\1", x, perl = TRUE)

дает

"5"               "maximusa/b=-4/1" "3"

, затем

after_slash=sub("^.*\\/(d+)","\\1", x, perl = TRUE)

дает

"maximusa/b=5/1"  "maximusa/b=-4/1" "maximusa/b=3/-2"

OTH, ожидаемый результат

до косой черты 5 -4 3

после косой черты 1 1 -2

как получить ожидаемый результат?

thx за ответы,

Я хотел бы добавить еще одно условие для извлечения строк, если предположить, что у нас есть такая строка.Как и OP, как мы могли бы извлечь со знаком +, а также игнорируя скобки?Текущее решение @mob дает

  x <- c("maximusa/b=(5/+1)","maximusa/b=(-4/1)","maximusa/b=(+3/-2)")

after_slash=sub("^.*/(\\d+)","\\1", x, perl = TRUE)
> after_slash
[1] "maximusa/b=(5/+1)"  "1)"                 "maximusa/b=(+3/-2)"

и

 before_slash=sub(".*=(-?\\d+).*","\\1", x, perl = TRUE)

  > before_slash
[1] "maximusa/b=(5/+1)"  "maximusa/b=(-4/1)"  "maximusa/b=(+3/-2)"

Я попробовал немного, но не повезло!

Ответы [ 3 ]

2 голосов
/ 28 марта 2019

Одна проблема в том, что

after_slash=sub("^.*\\/(d+)","\\1", x, perl = TRUE)

должно быть

after_slash=sub("^.*/(\\d+)","\\1", x, perl = TRUE)

Для захвата также отрицательных целых чисел вам понадобится

before_slash=sub(".*=(-?\\d+).*","\\1", x, perl = TRUE)
after_slash=sub("^.*/(-?\\d+)","\\1", x, perl = TRUE)

Жетоны -? означают «символ -, 0 или 1 раз»

1 голос
/ 28 марта 2019

Мы можем использовать str_extract_all для сопоставления - (если есть), за которым следуют одна или несколько цифр ([0-9]+) и изменить его тип на numeric

library(tidyverse)
map_dfc(str_extract_all(x, "-?[0-9]+"), as.numeric)
# A tibble: 2 x 3
#    V1    V2    V3
#  <dbl> <dbl> <dbl>
#1     5    -4     3
#2     1     1    -2

Или с помощью read.table после получения подстроки с помощью sub и последующего указания sep как / для создания двух столбца data.frame

read.table(text= sub(".*=", "", x), sep="/")
#   V1 V2
#1  5  1
#2 -4  1
#3  3 -2

Или другой вариант strsplit

sapply(strsplit(x, "[=/]"), `[`, 3:4)

Обновление

Если строка ОП также имеет (), первый вариант должен работать хорошо, но во втором варианте мы можем изменить

x1 <- c("maximusa/b=(5/1)","maximusa/b=(-4/1)","maximusa/b=(3/-2)")
read.table(text= gsub(".*=|[()]", "", x1), sep="/")
#  V1 V2
#1  5  1
#2 -4  1
#3  3 -2
0 голосов
/ 28 марта 2019

Это тоже должно работать.

matrix(as.numeric(unlist(strsplit(
  gsub("(^\\w*\\/)(b=)(-?\\d)(\\/)(-?\\d$)", "\\3 \\5", x), " "))), 2)
#      [,1] [,2] [,3]
# [1,]    5   -4    3
# [2,]    1    1   -2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...