我有一个值向量(比如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
),第二个向量包含第一个向量。有没有方便的方法来实现这个目标?
答案 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