避免数字向量移位数中的重复项
Avoid duplicates in numeric vector shifting numbers
我正在寻找从包含重复条目的数字向量出发的最佳方法,例如:
a=c(1,3,4,4,4,5,7,9,27,28,28,30,42,43)
到这个,如果合适的话,通过移动 +1 来避免重复:
b=c(1,3,4,5,6,7,8,9,27,28,29,30,42,43)
横向比较:
> data.frame(a=a, b=b)
a b
1 1 1
2 3 3
3 4 4
4 4 5
5 4 6
6 5 7
7 7 8
8 9 9
9 27 27
10 28 28
11 28 29
12 30 30
13 42 42
14 43 43
有什么简单快捷的方法吗?谢谢!
如果您希望它只完成一次(可能仍然重复):
a=c(1,3,4,4,4,5,7,9,27,28,28,30,42,43)
a <- ifelse(duplicated(a),a+1,a)
输出:
> a
[1] 1 3 4 5 5 5 7 9 27 28 29 30 42 43
将导致没有任何重复的状态的循环:
a=c(1,3,4,4,4,5,7,9,27,28,28,30,42,43)
while(length(a[duplicated(a)])) {
a <- ifelse(duplicated(a),a+1,a)
}
输出:
> a
[1] 1 3 4 5 6 7 8 9 27 28 29 30 42 43
另一种方法是使用递归函数:
no_dupes <- function(x) {
if (anyDuplicated(x) == 0)
x
else
no_dupes(x + duplicated(x))
}
no_dupes(a)
[1] 1 3 4 5 6 7 8 9 27 28 29 30 42 43
使用 purrr::accumulate
的 tidyverse 选项。
library(dplyr)
library(purrr)
accumulate(a, ~ if_else(.y <= .x, .x+1, .y))
# [1] 1 3 4 5 6 7 8 9 27 28 29 30 42 43
我正在寻找从包含重复条目的数字向量出发的最佳方法,例如:
a=c(1,3,4,4,4,5,7,9,27,28,28,30,42,43)
到这个,如果合适的话,通过移动 +1 来避免重复:
b=c(1,3,4,5,6,7,8,9,27,28,29,30,42,43)
横向比较:
> data.frame(a=a, b=b)
a b
1 1 1
2 3 3
3 4 4
4 4 5
5 4 6
6 5 7
7 7 8
8 9 9
9 27 27
10 28 28
11 28 29
12 30 30
13 42 42
14 43 43
有什么简单快捷的方法吗?谢谢!
如果您希望它只完成一次(可能仍然重复):
a=c(1,3,4,4,4,5,7,9,27,28,28,30,42,43)
a <- ifelse(duplicated(a),a+1,a)
输出:
> a
[1] 1 3 4 5 5 5 7 9 27 28 29 30 42 43
将导致没有任何重复的状态的循环:
a=c(1,3,4,4,4,5,7,9,27,28,28,30,42,43)
while(length(a[duplicated(a)])) {
a <- ifelse(duplicated(a),a+1,a)
}
输出:
> a
[1] 1 3 4 5 6 7 8 9 27 28 29 30 42 43
另一种方法是使用递归函数:
no_dupes <- function(x) {
if (anyDuplicated(x) == 0)
x
else
no_dupes(x + duplicated(x))
}
no_dupes(a)
[1] 1 3 4 5 6 7 8 9 27 28 29 30 42 43
使用 purrr::accumulate
的 tidyverse 选项。
library(dplyr)
library(purrr)
accumulate(a, ~ if_else(.y <= .x, .x+1, .y))
# [1] 1 3 4 5 6 7 8 9 27 28 29 30 42 43