#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:
Может быть, это то, что вы ищете