复制由其他向量确定的向量中的某些值

时间:2017-04-03 13:42:23

标签: r vector double repeat replicate

我有一个值向量(比如1:10),并希望在其中重复某些值2次或更多次,由另一个向量(比如c(3,4,6,8))确定。在此示例中,重复2次时结果为c(1,2,3,3,4,4,5,6,6,7,8,8,9,10)

这适用于任意长度范围向量(如200:600),第二个向量包含第一个向量。有没有方便的方法来实现这个目标?

4 个答案:

答案 0 :(得分:6)

Akrun是一种更紧凑的方法,但这也可行

# get rep vector
reps <- rep(1L, 10L)
reps[c(3,4,6,8)] <- 2L

rep(1:10, reps)
 [1]  1  2  3  3  4  4  5  6  6  7  8  8  9 10

这里的见解是rep将在第二个参数中采用与第一个参数相同长度的整数向量,该第一个参数指示第一个参数的每个元素的重复次数。

请注意,此解决方案依赖于c(3,4,6,8)是要重复的元素的索引或位置的假设。在这种情况下,d-b的评论有一个单行

rep(x, (seq_along(x) %in% c(3,4,6,8)) + 1)

相反,c(3,4,6,8)表示要重复的值,然后是docendo-discimus的超紧凑代码,

rep(x, (x %in% c(3,4,6,8)) * (n-1) +1)

其中可以调整n以改变重复次数。如果你需要多次调用它,可以将其汇总到像

这样的函数中
myReps <- function(x, y, n) rep(x, (x %in% y) * (n-1) +1)

并称为

myReps(1:10, c(3,4,6,8), 2)

在当前情况中。

答案 1 :(得分:4)

我们可以尝试

i1 <- v1 %in% v2
sort(c(v1[!i1], rep(v1[i1], each = 2)))
#[1]  1  2  3  3  4  4  5  6  6  7  8  8  9 10

更新

对于任意向量,

f1 <- function(vec1, vec2, n){
i1 <- vec1 %in% vec2
vec3 <- seq_along(vec1)
 c(vec1[!i1], rep(vec1[i1], each = n))[order(c(vec3[!i1], 
            rep(vec3[i1], each=n)))]
 }

set.seed(24)
v1N <- sample(10)
v2 <- c(3,4,6,8)
v1N
#[1]  3 10  6  4  7  5  2  9  8  1

f1(v1N, v2, 2)
#[1]  3  3 10  6  6  4  4  7  5  2  9  8  8  1
f1(v1N, v2, 3)
#[1]  3  3  3 10  6  6  6  4  4  4  7  5  2  9  8  8  8  1

答案 2 :(得分:3)

这是使用sapply

的另一种方法
#DATA
x = 1:10
r = c(3,4,6,8)
n = 2 #Two repetitions of selected values

#Assuming 'r' is the index of values in x to be repeated
unlist(sapply(seq_along(x), function(i) if(i %in% r){rep(x[i], n)}else{rep(x[i],1)}))
#[1]  1  2  3  3  4  4  5  6  6  7  8  8  9 10

#Assuming 'r' is the values in 'x' to be repeated
unlist(sapply(x, function(i) if(i %in% r){rep(i, n)}else{rep(i, 1)}))
#[1]  1  2  3  3  4  4  5  6  6  7  8  8  9 10

Haven没有彻底测试这些,但可能是替代方案。请注意,此方法的输出顺序将大不相同。

sort(c(x, rep(x[x %in% r], n-1))) #assuming 'r' is values
#[1]  1  2  3  3  4  4  5  6  6  7  8  8  9 10
sort(c(x, rep(x[r], n-1))) #assuming 'r' is index
#[1]  1  2  3  3  4  4  5  6  6  7  8  8  9 10

答案 3 :(得分:1)

我建议这个解决方案只是为了强调基础R中append函数的很酷用法:

ff <- function(vec, v, n) {
    for(i in seq_along(v)) vec <- append(vec, rep(v[i], n-1), after = which(vec==v[i]))
    vec
}

示例:

set.seed(1)

ff(vec = sample(10), v = c(3,4,6,8), n = 2)
#[1]  3  3  4  4  5  7  2  8  8  9  6  6 10  1

ff(vec = sample(10), v = c(2,5,9), n = 4)
#[1]  3  2  2  2  2  6 10  5  5  5  5  7  8  4  1  9  9  9  9