我在R中有一个向量,其中有些重复:
v <- c(1,1,1,2,2,3)
现在,我需要一个函数来替换重复项,以获得后缀增加的序列:
result <- c(1,1.2,1.3,2,2.2,3)
答案 0 :(得分:3)
使用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
答案 1 :(得分:0)
这是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
答案 2 :(得分:0)
这里有一个使用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