R语言:以向量值为分段长度拆分另一向量计算各段均值
实现方案
你可以通过以下两种方式实现需求,结果都和你给出的预期输出完全匹配:
方法1:通过起止索引计算
# 定义输入向量 vec1 <- c(5, 2, 2, 2, 2, 3, 2, 3, 9, 6, 2, 2, 2, 3) vec2 <- c(1.96845698, 1.11342534, 0.82580110, 0.35762122, 0.07210485, 0.06046759, 0.93615974, 0.85691566, 0.39439991, 0.26110080, 1.22082336, 0.71940824, 0.32571803, 0.46358160, 0.16009616, 0.13348428, 1.16801097, 0.30184661, 0.51190796, 1.69680701, 0.54418158, 0.74969466, 0.17246107, 0.66953561, 1.02689205, 1.67408220, 1.20311478, 0.74049935, 0.55211334, 0.31037724, 0.23620425, 0.34532764, 1.64696898, 0.23094382, 0.67733098, 0.32226374, 0.25774802, 0.35768477, 0.27219803, 0.02042260, 0.53784081, 1.27521977, 0.07043151, 0.11879638, 0.13358880) # 可选校验:避免长度不匹配导致错误 if (sum(vec1) != length(vec2)) { stop("vec1元素总和与vec2长度不匹配,无法完成分段") } # 计算每段的起止索引 end_idx <- cumsum(vec1) start_idx <- c(1, end_idx[-length(end_idx)] + 1) # 批量计算每段均值 vec3 <- mapply(function(s, e) mean(vec2[s:e]), start_idx, end_idx)
方法2:基于分组统计的简洁实现
# 生成分组标签:每个元素对应vec2中元素所属的分段序号 groups <- rep(seq_along(vec1), times = vec1) # 按分组计算均值,转回向量格式 vec3 <- as.vector(tapply(vec2, groups, mean))
结果验证
运行上述代码后得到的vec3和你给出的预期输出完全一致,可通过以下代码验证:
expected <- c(0.8674819, 0.4983137, 0.6256578, 0.7409621, 0.5225631, 0.2523873, 0.7349288, 0.9176322, 0.7887523, 0.5765066, 0.3077164, 0.1463103, 0.9065303, 0.1076056) all.equal(vec3, expected)
内容的提问来源于stack exchange,提问作者climsaver
相关产品推荐
相关产品推荐

