R 复制直到满足长度
R Replicating until length is met
假设我们有以下内容:
a=c( 1, 9, 5, 7, 8, 11)
length(a) ## 6
我想获得:
a_desired=c( 1, 1, 9, 9, 5, 5, 7, 7, 8, 11)
length(a_desired) ## 10
基本上它会在达到所需长度时停止复制,在本例中为 10。
如果需要的长度是14,
a_desired=c( 1, 1, 1, 9, 9, 9, 5, 5, 7, 7, 8, 8, 11, 11)
有没有人对如何获得这个或可能 link 之前问过的类似问题有任何建议?(我不太确定要寻找什么关键字)
你可以编写自己的函数来做这样的事情
extend_to <- function(x, len) {
stopifnot(len>0)
times = len %/% length(x)
each <- rep(times, length(x))
more <- len-sum(each)
if (more>0) {
each[1:more] <- each[1:more]+1
}
rep(x, each)
}
a <- c( 1, 9, 5, 7, 8, 11)
extend_to(a, 6)
# [1] 1 9 5 7 8 11
extend_to(a, 10)
# [1] 1 1 9 9 5 5 7 7 8 11
extend_to(a, 14)
# [1] 1 1 1 9 9 9 5 5 7 7 8 8 11 11
extend_to(a, 2)
# [1] 1 9
我们使用 rep()
将每个元素重复一定次数。
因此,如果您的序列当前长度为 M,而您希望长度 N > M,那么您有以下可能性:
N <= 2M:将前 (N-M) 个项目加倍
2M < N <= 3M:前 (N-2M) 个项目的三倍,其余项目的两倍
3M < N <= 4M:将前 (N-3M) 个项目翻四倍,将其余项目翻三倍。
等等。
所以首先,将目标长度除以当前长度,发言,然后将序列复制那么多次。然后添加前 剩余 项的额外副本。
a=c( 1, 9, 5, 7, 8, 11)
m=length(a)
n=10 # desired new length
new_a = append(
rep(a[1:(n%%m)],each=ceiling(n/m)),
rep(a[((n%%m)+1):m],each=floor(n/m)))
假设我们有以下内容:
a=c( 1, 9, 5, 7, 8, 11)
length(a) ## 6
我想获得:
a_desired=c( 1, 1, 9, 9, 5, 5, 7, 7, 8, 11)
length(a_desired) ## 10
基本上它会在达到所需长度时停止复制,在本例中为 10。
如果需要的长度是14,
a_desired=c( 1, 1, 1, 9, 9, 9, 5, 5, 7, 7, 8, 8, 11, 11)
有没有人对如何获得这个或可能 link 之前问过的类似问题有任何建议?(我不太确定要寻找什么关键字)
你可以编写自己的函数来做这样的事情
extend_to <- function(x, len) {
stopifnot(len>0)
times = len %/% length(x)
each <- rep(times, length(x))
more <- len-sum(each)
if (more>0) {
each[1:more] <- each[1:more]+1
}
rep(x, each)
}
a <- c( 1, 9, 5, 7, 8, 11)
extend_to(a, 6)
# [1] 1 9 5 7 8 11
extend_to(a, 10)
# [1] 1 1 9 9 5 5 7 7 8 11
extend_to(a, 14)
# [1] 1 1 1 9 9 9 5 5 7 7 8 8 11 11
extend_to(a, 2)
# [1] 1 9
我们使用 rep()
将每个元素重复一定次数。
因此,如果您的序列当前长度为 M,而您希望长度 N > M,那么您有以下可能性:
N <= 2M:将前 (N-M) 个项目加倍
2M < N <= 3M:前 (N-2M) 个项目的三倍,其余项目的两倍
3M < N <= 4M:将前 (N-3M) 个项目翻四倍,将其余项目翻三倍。
等等。
所以首先,将目标长度除以当前长度,发言,然后将序列复制那么多次。然后添加前 剩余 项的额外副本。
a=c( 1, 9, 5, 7, 8, 11)
m=length(a)
n=10 # desired new length
new_a = append(
rep(a[1:(n%%m)],each=ceiling(n/m)),
rep(a[((n%%m)+1):m],each=floor(n/m)))