Отдельный символьный столбец N-ным символом? - PullRequest
0 голосов
/ 29 января 2019

Для примера df:

df <- structure(list(test_id = c("123-456789123", "785-525135627", 
"6545646545665456", "988898-65464654646464664", "987-656546464", "666-654564654"
)), row.names = c(NA, -6L), class = c("tbl_df", "tbl", "data.frame"
))

Я хочу разделить вышеуказанный столбец на 2 столбца:

  1. Последние N символов идентификатора (скажем, 8)
  2. Префикс оставлен

Например, учитывая N = 8:

987-656546464 ---> split to: postfix  prefix
                             56546464 987-6

Я пробовал отдельную функцию, чтобы сделать это:

separate(df, col = test_id, into = c("prefix", "postfix"), sep = "(.{8}$)", convert = T)

Ноэто не дает мне вторую часть.

Пожалуйста, сообщите.

Ответы [ 4 ]

0 голосов
/ 30 января 2019

Вот что решило мою проблему, не потеряв ни одной цифры.Помните, что цель состояла в том, чтобы отделить 8 символов от конца и посмотреть, что осталось (префикс 8 последних символов).Мне нужно знать, какие уникальные префиксы для последних 8 символов находятся в моих данных.

df %>%
  as_tibble() %>%
  dplyr::mutate(test_id = str_sub(test_id, end = nchar(test_id) - 8))
0 голосов
/ 29 января 2019

Без использования дополнительного пакета, но с sapply и strsplit (очевидно, вы должны обернуть вещи в функции, чтобы иметь более четкий синтаксис):

>t(sapply(df[,1],function(i,n){sp=unlist(strsplit(i,""));c(postfix=paste0(sp[(length(sp)-n+1):length(sp)],collapse=""),prefix=paste0(sp[1:(length(sp)-n)],collapse=""))},n=8))
                         postfix    prefix
123-456789123            "56789123" "123-4"
785-525135627            "25135627" "785-5"
6545646545665456         "45665456" "65456465"
988898-65464654646464664 "46464664" "988898-654646546"
987-656546464            "56546464" "987-6"
666-654564654            "54564654" "666-6"
0 голосов
/ 29 января 2019

Обратите внимание, что df, показанный в вопросе, НЕ является data.frame, поэтому давайте назовем его x.Затем преобразуйте его во фрейм данных и используйте separate с sep = -8:

library(dplyr)
library(tidyr)
x <- df 

x %>% 
  data.frame %>%
  separate(test_id, into = c("pre", "post"), sep = -8)

, что дает:

               pre     post
1            123-4 56789123
2            785-5 25135627
3         65456465 45665456
4 988898-654646546 46464664
5            987-6 56546464
6            666-6 54564654
0 голосов
/ 29 января 2019

Обновить грубый ответ df2 - это df

library(tidyverse)
df2$text_id<-gsub("[-]", "\\1 \\2", df2$test_id)
df2$test_id
df2<-df2 %>% 
  mutate(text_id=str_remove_all(df2$text_id,"\\s"),
         text_id=substr(df2$text_id,1,5))
df2$tesxt_id<-str_replace_all(df2$text_id," ","-")
df2 %>% 
  separate(test_id,c("pre","post"),sep="\\d(?=\\d{8,})",convert = T) %>% 
  select(tesxt_id,post)

Результат:

 tesxt_id     post
  <chr>       <int>
1 123-4    56789123
2 785-5    25135627
3 65456          NA
4 98889          NA
5 987-6    56546464
6 666-6    54564654

Попробуйте: переименовать столбцы по мере необходимости.Это соответствует любой цифре, по крайней мере, 8-значному числу перед.Мы используем прогноз (?=), который проверяет, есть ли перед цифрой \\d номер, по крайней мере, с 8 цифрами \\d{8,}.

df %>% 
  separate(test_id,c("pre","post"),sep="\\d(?=\\d{8,})",convert = T)
...