#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