编辑:只是为了好玩,下面是我的解决方案的较短递归版本
add_nas <- function(v,n_seq = 12,min_l_seq = 1,max_l_seq = 144){
insert_length <- sample(min_l_seq:max_l_seq,1)
insert_pos <- sample(length(v)-insert_length,1)
v <- v[-(insert_pos+(1:insert_length)-1)]
if(n_seq > 1){v <- add_nas(v,n_seq-1,min_l_seq,max_l_seq)}
append(v,rep(NA,insert_length),insert_pos-1)
}
旧答案:
# we build a vextor of 20 values
v <- sample(1:100,20,replace=TRUE) # your vector
# your parameters
n_seq <- 3 # you put 12 here
min_l_seq <- 1 #
max_l_seq <- 5 # you put 144 here
# first we will delete items, then we add NAs where we deleted instead
insert_lengths <- sample(min_l_seq:max_l_seq,n_seq,replace=TRUE)
lengths_before_deletion <- length(v)- c(0,insert_lengths[-length(insert_lengths)])
insert_pos <- sapply(lengths_before_deletion-insert_lengths+1,function(x){sample(1:x,1)})
v2 <- v
print(v)
for (i in 1:n_seq){
v2 <- v2[-(insert_pos[i]:(insert_pos[i]+insert_lengths[i]-1))]
print(v2)
}
for (i in n_seq:1){
v2 <- c(v2[1:(insert_pos[i]-1)],rep(NA,insert_lengths[i]),v2[insert_pos[i]:length(v2)])
print(v2)
}
这是日志
> print(v)
[1] 75 11 4 19 55 20 65 48 85 20 61 16 75 31 50 10 30 61 4 32
> for (i in 1:n_seq){
+ v2 <- v2[-(insert_pos[i]:(insert_pos[i]+insert_lengths[i]-1))]
+ print(v2)
+ }
[1] 75 11 55 20 65 48 85 20 61 16 75 31 50 10 30 61 4 32
[1] 75 11 55 20 65 48 85 20 61 16 75 50 10 30 61 4 32
[1] 75 11 55 20 65 48 85 20 61 16 75 50 10 30 32
>
> for (i in n_seq:1){
+ v2 <- c(v2[1:(insert_pos[i]-1)],rep(NA,insert_lengths[i]),v2[insert_pos[i]:length(v2)])
+ print(v2)
+ }
[1] 75 11 55 20 65 48 85 20 61 16 75 50 10 30 NA NA 32
[1] 75 11 55 20 65 48 85 20 61 16 75 NA 50 10 30 NA NA 32
[1] 75 11 NA NA 55 20 65 48 85 20 61 16 75 NA 50 10 30 NA NA 32