R: Как изменить новый идентификатор, изменив предыдущий идентификатор? - PullRequest
0 голосов
/ 28 марта 2020

Я задал вопрос ( Как изменить новый столбец путем изменения другого столбца? )

Теперь у меня есть другая проблема. Мне нужно использовать больше «неопрятных» идентификаторов, например,

df1 <- data.frame(id=c("A-1","A-10","A-100","b-1","b-10","b-100"),n=c(1,2,3,4,5,6))

из этих идентификаторов, я хочу назначить новые «аккуратные» идентификаторы, например,

df2 <- data.frame(id=c("A0001","A0010","A0100","B0001","B0010","B0100"),n=c(1,2,3,4,5,6))

(теперь мне нужен капитал) B 'вместо' b ')

Я пытался использовать функцию str_pad, но не смог.

Ответы [ 3 ]

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

Мы можем разделить данные в разные столбцы на основе "-", преобразовать буквы в верхний регистр, используя sprintf с нулями и объединить два столбца с unite.

library(dplyr)
library(tidyr)

df1 %>%
  separate(id, c("id1", "id2"), sep = "-") %>%
  mutate(id1 = toupper(id1), 
         id2 = sprintf('%04s', id2)) %>%
  unite(id, id1, id2, sep = "")

#     id n
#1 A0001 1
#2 A0010 2
#3 A0100 3
#4 B0001 4
#5 B0010 5
#6 B0100 6

На основании комментария, если есть случаи, когда у нас нет разделителя, и мы хотим изменить определенные значения id1, мы можем использовать следующее.

df1 %>%
  extract(id, c("id1", "id2"), regex = "([:alpha:])-?(\\d+)") %>%
  mutate(id1 = case_when(id1 == 'c' ~ 'B', 
                         TRUE ~ id1), 
         id1 = toupper(id1),id2 = sprintf('%04s', id2)) %>%
  unite(id, id1, id2, sep = "")
1 голос
/ 28 марта 2020

Базовое решение R

df1$id <- sub("^(.)0+?(.{4})$","\\1\\2", sub("-", "0000", toupper(df1$id)))

решение в обратном направлении

library(tidyverse)    
df1$id <- str_to_upper(df1$id) %>%
  str_replace("-","0000") %>%
  str_replace("^(.)0+?(.{4})$","\\1\\2")

Выход

df1

#      id n
# 1 A0001 1
# 2 A0010 2
# 3 A0100 3
# 4 B0001 4
# 5 B0010 5
# 6 B0100 6

Данные

df1 <- data.frame(id=c("A-1","A-10","A-100","b-1","b-10","b-100"),n=c(1,2,3,4,5,6))
1 голос
/ 28 марта 2020

Функция str_pad удобна для этой цели, как вы сказали. Но вы должны сначала извлечь цифры, а затем вставить их обратно вместе.

library(stringr)

paste0(toupper(str_extract(df1$id, "[aA-zZ]-")), 
      str_pad(str_extract(df1$id, "\\d+"), width=4, pad="0"))

[1] "A-0001" "A-0010" "A-0100" "B-0001" "B-0010" "B-0100"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...