分割向量并填充所有其他元素以具有特定长度

时间:2019-11-19 09:22:44

标签: r

我有一个向量,我将其分成几个部分,计算每个部分的平均值,然后我想要一个具有原始长度的向量,该向量将包含平均值,并且在它们之间用NA填充。

vec <- c(1000, 2000, 3000, 4000, 5000, 6000, 7000, 8000)
s <- 2

parts <- split(vec, rep(1:s, ceiling(length(vec) / s),
              length.out = length(vec)))

the_mean <- lapply(parts, mean)
res <- unlist(the_mean)

res <- replace(NA * s, seq(from = 1 , to = length(vec), length = length(res)), res)
res

我现在收到的结果是:

4000 NA NA NA NA NA NA 5000

我想收到:

4000 NA NA 5000 NA NA NA NA

因为分裂是通过s <-2完成的,所以我有第一个均值(4000),在2个值之后,我必须有第二个均值(5000)。其余向量应填充NA。原因是我希望结果向量的长度与初始(vec)的长度相同。

例如,如果s = 3,则结果应为:

4000 NA NA NA 5000 NA NA 4500

请注意,由于向量大小为8,因此在5000和4500之间,我们有2个NA,而不是3个。

1 个答案:

答案 0 :(得分:1)

这是一种实现方法:

apply_fun <- function(vec, s) {
   #Initialize the vector with NA
   ans <- rep(NA, length(vec))
   #Create groups to calculate mean
   groups <- rep(1:s, ceiling(length(vec) / s),length.out = length(vec))
   #Create indices to place mean of each group
   vals <- pmin(seq(1, by = s + 1, length.out = s), length(vec))
   #Assign mean values at those indices
   ans[vals] <- tapply(vec, groups, mean)
   #Return the final answer
   return(ans)
}

apply_fun(vec, 2)
#[1] 4000   NA   NA 5000   NA   NA   NA   NA

apply_fun(vec, 3)
#[1] 4000   NA   NA   NA 5000   NA   NA 4500