Перекодируйте идентификаторы символов в числовые идентификаторы

#r #recode

Вопрос:

Мне нужно изменить id значения переменных. Вот как выглядит образец данных:

 df lt;- data.frame(id = c(11,21,22,"33_AS_A","33_AS_B","33_AS_X", "35_Part1","35_Part2","35_Part4","35_Part7"),  Grade= c(3,3,3, 4,4,4,5,5,5,5))  gt; df  id Grade 1 11 3 2 21 3 3 22 3 4 33_AS_A 4 5 33_AS_B 4 6 33_AS_X 4 7 35_Part1 5 8 35_Part2 5 9 35_Part4 5 10 35_Part7 5  

Мне нужно перекодировать id как числовую переменную, указав упорядоченные числовые значения вместо текстовых значений по порядку.

Вот мой желаемый результат выглядит так:

 gt; df2  id Grade 1 11 3 2 21 3 3 22 3 4 331 4 5 332 4 6 333 4 7 351 5 8 352 5 9 353 5 10 354 5  

Есть какие-нибудь идеи?

Ответ №1:

 library(dplyr) library(stringr) df %gt;%  mutate(  group = str_extract(id, "[0-9] ")  ) %gt;%  group_by(group) %gt;%  mutate(id = as.numeric(paste0(group, if(n() gt; 1) row_number() else ""))) %gt;%  ungroup() %gt;%  select(-group) # # A tibble: 10 × 2 # id Grade # lt;dblgt; lt;dblgt; # 1 11 3 # 2 21 3 # 3 22 3 # 4 331 4 # 5 332 4 # 6 333 4 # 7 351 5 # 8 352 5 # 9 353 5 #10 354 5  

Ответ №2:

Используя базу, разделитесь на группы по номерам, если длина группы не равна 1, затем добавьте номер строки:

 x lt;- sapply(strsplit(df$id, "_"), `[`, 1)  df$ID lt;- unlist(sapply(split(x, x), function(i)   if(length(i) == 1) i else paste0(i, seq(i))))  df # id Grade ID # 1 11 3 11 # 2 21 3 21 # 3 22 3 22 # 4 33_AS_A 4 331 # 5 33_AS_B 4 332 # 6 33_AS_X 4 333 # 7 35_Part1 5 351 # 8 35_Part2 5 352 # 9 35_Part4 5 353 # 10 35_Part7 5 354