如何统计R语言中含0、1、2的向量内连续零的分布?
提取R向量中连续零模式的出现次数
嘿,我来帮你搞定这个提取连续零模式次数的问题!针对你这种只包含0、1、2的向量,我们可以用R的原生函数高效解决,就算是1000-2000元素的数据集也完全没问题。
完整解决方案代码
# 示例向量(你可以替换成自己的数据集) x <- c(0,1,0,2,0,0,1,0,0,1,0,0,0,1,0) # 1. 对向量做游程编码,获取连续重复元素的长度和对应值 rle_result <- rle(x) # 2. 筛选出所有连续零序列的长度 zero_run_lengths <- rle_result$lengths[rle_result$values == 0] # 3. 统计每个零序列长度的出现次数 zero_count_table <- table(zero_run_lengths) # 4. 转换成要求的输出格式:"0 3 00 2 000 1" 这种形式 output_elements <- mapply(function(len_str, count) { zero_pattern <- paste(rep("0", as.integer(len_str)), collapse = "") paste(zero_pattern, count) }, names(zero_count_table), zero_count_table) # 合并成最终输出字符串 final_output <- paste(output_elements, collapse = " ") # 打印结果 cat(final_output) # 输出:0 3 00 2 000 1
步骤详解
- 游程编码(
rle()):这个函数是核心!它会把输入向量转换成一个包含lengths和values的列表:lengths记录每个连续重复元素的长度,values记录对应的元素值。比如示例向量经过rle()后,会得到类似lengths: c(1,1,1,1,2,1,2,1,3,1,1),values: c(0,1,0,2,0,1,0,1,0,1,0)的结果。 - 筛选连续零的长度:我们只需要从
rle_result里挑出values == 0对应的lengths,这就是所有连续零序列的长度列表(示例里是c(1,1,2,2,3,1))。 - 统计次数:用
table()函数统计每个长度出现的次数,得到类似1:3, 2:2, 3:1的结果。 - 格式转换:把每个长度数字转换成对应数量的"0"字符串(比如长度1→"0",长度2→"00"),再和次数拼接成“模式 次数”的格式,最后合并成一个完整的输出字符串。
这个方法效率很高,就算是最大长度等于向量总长度的极端情况也能完美处理,完全适配你的数据集规模。
内容的提问来源于stack exchange,提问作者Robert Long
相关产品推荐
相关产品推荐

