R - конфиденциальность разделения строки на столбцы - PullRequest
1 голос
/ 11 февраля 2020

мой фрейм данных выглядит примерно так

df <-
  data.frame(
    id = seq(1, 5, 1),
    acc = c(NA_character_, "115-7981987/7121", "48415875/4874", "8740-454648484/100", "18715/7811")
  )

Я бы хотел создать 3 новых столбца из столбца cc. Я ищу решение dplyr

  1. , если есть символ -, то получить значение до этого символа, разделить строку на / символ, но не включать в себя часть перед символом (в случае, если присутствует)

Другими словами, результат должен быть точно:

result <-
  data.frame(
    id = seq(1, 5, 1),
    prefix = c(NA_character_, "115", NA_character_, "8740", NA_character_),
    number = c(NA_character_, "7981987", "48415875", "454648484", "18715"),
    code = c(NA_character_, "7121", "4874", "100", "7811")
  )

Обычно я использовал бы str_split(acc, "/"), а затем извлекал части, подобные этому map_chr(uuid, 1) Но это не работает поскольку некоторые поля cc пусты, а некоторые не включают все символы.

Ответы [ 2 ]

5 голосов
/ 11 февраля 2020

Вариант с участием tidyr может быть:

df %>%
 separate(acc, into = c("prefix", "number"), sep = "-", fill = "left") %>%
 separate(number, into = c("number", "code"), sep = "/")

  id prefix    number code
1  1   <NA>      <NA> <NA>
2  2    115   7981987 7121
3  3   <NA>  48415875 4874
4  4   8740 454648484  100
5  5   <NA>     18715 7811
2 голосов
/ 11 февраля 2020

Вот один из способов использования str_extract

library(dplyr)
library(stringr)

df %>%
         #Get a number before "-"
  mutate(prefix = str_extract(acc, "\\d+(?=-)"),
         #Get a number between "-" and "/"
         number = str_extract(acc, "(?<=-?)\\d+(?=/)"), 
         #Get a number before "/"
         code = str_extract(acc, "(?<=/)\\d+")) %>%
  select(-acc)

#  id prefix    number code
#1  1   <NA>      <NA> <NA>
#2  2    115   7981987 7121
#3  3   <NA>  48415875 4874
#4  4   8740 454648484  100
#5  5   <NA>     18715 7811

Однострочный вариант с extract из tidyr

tidyr::extract(df, acc, c("prefix", "number", "code"), "(.*?)-?(\\d+)/(\\d+)")

Вместо этого возвращается пробел NA для некоторых значений в столбце prefix, которые при необходимости можно изменить на NA.

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