Переименуйте значения в одном столбце, которые заканчиваются одной и той же строкой

#r #dataframe #dplyr #data-manipulation

#r #фрейм данных #dplyr #манипулирование данными

Вопрос:

У меня есть несколько больших фреймов данных с одним столбцом (назовем его timeperiod так), содержащим переменные текстовой строки. Все переменные заканчиваются одной и той же строкой ( V.1to2 или V.2to3) , но начала разные.

Я хочу, чтобы значения с одинаковыми окончаниями были изменены. В качестве примера:

 df lt;- data.frame (Location = c("a","b","c","d","e","f","g","h"),  timeperiod = c("A.V.1to2", "D.V.1to2", "A.V.1to2","D.V.2to3","A.V.3to4","H.V.3to4","A.V.4to5","D.V.4to5"))  

Как показано на рисунке:

 Location timeperiod 1 a A.V.1to2 2 b D.V.1to2 3 c A.V.1to2 4 d D.V.2to3 5 e A.V.3to4 6 f H.V.3to4 7 g A.V.4to5 8 h D.V.4to5  

***(правка) Существует несколько различных типов фреймов данных, и все они нуждаются в изменении столбца timeperiod таким образом, чтобы присваивать числа вместо строк, однако я слишком упрощал, когда впервые задал этот вопрос. В некоторых случаях число совпадает с первым числом в строке, но в других случаях оно не совпадает. Вот обновленный ожидаемый результат, который отражает эту ситуацию. ***

Мой желаемый результат был бы следующим:

 df2  Location timeperiod 1 a 0 2 b 0 3 c 0 4 d 2 5 e 3 6 f 3 7 g 5 8 h 5  df2 lt;- data.frame (Location = c("a","b","c","d","e","f","g","h"),  timeperiod = c(0, 0, 0, 2, 3, 3, 5, 5))    

(править) С этим ожидаемым результатом вы можете видеть, что бывают ситуации, когда числа совпадают с первым числом в строке, но есть и другие ситуации в данных, когда они не совпадают. Приношу извинения за то, что не прояснил это в первом примере

Пример кода:

 df$timeperiod[df$timeperiod =="A.V.1to2"] lt;- "0"  

Из-за размера моего набора данных и необходимости повторять это для нескольких фреймов данных с разными префиксами для значений периода времени, я хотел бы использовать dplyr вот так:

 library(dplyr) df$timeperiod lt;- revalue(df$timeperiod, c(ends_with(V.1to2)="0")) df$timeperiod lt;- revalue(df$timeperiod, c(ends_with(V.2to3)="2")) #etc..   

Поэтому я могу сделать это снова с другими значениями и таблицами. Но это не работает, и переименование каждого конкретного значения кажется неэффективным, поэтому любое решение быстрее, чем это, послужило бы своей цели.

Комментарии:

1. Привет @parksnrec1, я думаю, вы хотите назначить первое числовое значение в качестве периода времени.

2. Является ли «V. XtoY» (последние 6 символов из timeperiod) вашей желаемой групповой переменной?

3. Привет @Isa , я думаю, что, возможно, я слишком упростил свои данные здесь. В некоторых случаях это первое числовое значение, но в других случаях это не так. Например, некоторые фреймы данных имеют суффикс, например: V. 1to2, и им необходимо присвоить значение timeperiod как 0.

4. Привет @GuedesBF , Да, «V. xtoy» — это переменная, которая группирует значения для timeperiod. Спасибо

5. Хорошо, спасибо за ответ. В этом случае я думаю, что мой ответ делает свое дело

Ответ №1:

Мы могли бы использовать str_extract :

 library(dplyr) library(stringr)  df %gt;%   mutate(timeperiod = str_extract(timeperiod, '\d '))  
 Location timeperiod 1 a 1 2 b 1 3 c 1 4 d 2 5 e 3 6 f 3 7 g 4 8 h 4  

Комментарии:

1. Если шаблон действительно так прост, то проще и быть не может! 1

2. Спасибо @TarJae, я прошу прощения, что не объяснил должным образом в первый раз. Я отредактировал вопрос, и вы можете видеть, что первое число в строке не соответствует необходимому значению. Спасибо за ваше предложение!

Ответ №2:

Мы можем использовать dplyr и stringr. Сначала извлеките последние 6 символов из timeperiod . Затем, group_by timeperiod, и, наконец, используйте cur_group_id

 library(dplyr) library(stringr)  df %gt;% mutate(timeperiod = str_extract(timeperiod, '.{6}


Ответ №3:

Может быть, это то, что вы ищете

 df lt;- data.frame (Location = c("a","b","c","d","e","f","g","h"),  timeperiod = c("A.V.1to2", "D.V.1to2", "A.V.1to2","D.V.2to3","A.V.3to4","H.V.3to4","A.V.4to5","D.V.4to5"))  df$timeperiod lt;- substr(gsub('[[:alpha:]]|[[:punct:]]', '', df$timeperiod), 1, 1)  df   Location timeperiod 1 a 1 2 b 1 3 c 1 4 d 2 5 e 3 6 f 3 7 g 4 8 h 4  

))%gt;% group_by(timeperiod)%gt;% mutate(timeperiod = cur_group_id())%gt;% ungroup() # A tibble: 8 × 2 Location timeperiod lt;chrgt; lt;intgt; 1 a 1 2 b 1 3 c 1 4 d 2 5 e 3 6 f 3 7 g 4 8 h 4

Ответ №3:

Может быть, это то, что вы ищете