Управление дубликатами - PullRequest
       6

Управление дубликатами

1 голос
/ 05 августа 2020

У меня есть вектор в R с некоторыми дубликатами:

v <- c(1,1,1,2,2,3)

Теперь мне нужна функция, которая заменяет дубликаты, чтобы получить последовательность возрастающих суффиксов:

result <- c(1,1.2,1.3,2,2.2,3)

Ответы [ 3 ]

3 голосов
/ 05 августа 2020

Используя ave, вы можете создать порядковый номер для каждого повтора:

ave(v, v, FUN = seq_along)
#[1] 1 2 3 1 2 1

Разделите это на 10, чтобы получить

ave(v, v, FUN = seq_along)/10
#[1] 0.1 0.2 0.3 0.1 0.2 0.1

Теперь добавьте к нему v

v1 <- v + ave(v, v, FUN = seq_along)/10
v1
#[1] 1.1 1.2 1.3 2.1 2.2 3.1

Теперь, поскольку вы не хотите изменять первое значение каждой группы, вы можете сделать:

v1[!duplicated(v)] <- unique(v)
v1
#[1] 1.0 1.2 1.3 2.0 2.2 3.0
0 голосов
/ 05 августа 2020

Здесь решение с использованием dplyr, возможно, не так просто, как предыдущие ответы @RuiBarradas и @RonakShah, потому что вам нужно преобразовать в фрейм данных и выполнить некоторые манипуляции, но это может быть полезно:

library(tidyverse)
v <- c(1,1,1,2,2,3)
#Dataframe
v1 <- data.frame(v)
#Mutate
v1 %>% group_by(v) %>% mutate(v2=as.character(1:n()),
                              v2=ifelse(v2=='1',as.character(v),paste0(v,'.',v2))) %>% 
  ungroup() %>% select(v2)

# A tibble: 6 x 1
  v2   
  <chr>
1 1    
2 1.2  
3 1.3  
4 2    
5 2.2  
6 3    
0 голосов
/ 05 августа 2020

Вот решение с ave. Хотя @ Ronak Shah уже опубликовал решение, также с ave, я считаю, что это другое.

ave(v, v, FUN = function(x) x + c(0, seq_along(x)[-1])/10)
#[1] 1.0 1.2 1.3 2.0 2.2 3.0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...