You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从01数字序列中提取spell长度并计算均值、标准差等统计量

R实现0-1字符串游程提取与统计方案

实现思路

  • 利用R自带的rle()函数(游程编码)直接计算连续相同值的长度,不需要手动拆分遍历
  • 自定义单个字符串处理函数,拆分0和1对应的游程长度,分别完成拼接和统计计算
  • 批量处理向量内所有字符串后合并为结构化结果表

可运行代码

以下写法依赖tidyverse套件做批量处理和表格输出,也可以调整为纯base R实现:

# 加载依赖包
library(tidyverse)

# 自定义众数计算函数(R base无内置众数函数)
get_mode <- function(x) {
  ux <- unique(x)
  ux[which.max(tabulate(match(x, ux)))]
}

# 单字符串处理逻辑
process_binary_str <- function(s) {
  # 拆分字符串为数字向量
  num_vec <- strsplit(s, "") %>% unlist() %>% as.integer()
  # 计算游程
  rle_res <- rle(num_vec)
  # 拆分0、1对应的游程长度
  len_0 <- rle_res$lengths[rle_res$values == 0]
  len_1 <- rle_res$lengths[rle_res$values == 1]
  
  # 生成目标字段,不需要的统计量可以直接删掉对应行
  tibble(
    spell_0 = paste(len_0, collapse = "-"),
    spell_1 = paste(len_1, collapse = "-"),
    mean_spell_0 = mean(len_0),
    mean_spell_1 = mean(len_1),
    mode_spell_0 = get_mode(len_0),
    mode_spell_1 = get_mode(len_1),
    sd_spell_0 = ifelse(length(len_0) > 1, sd(len_0), 0), # 单游程时标准差设为0,也可以保留NA
    sd_spell_1 = ifelse(length(len_1) > 1, sd(len_1), 0)
  )
}

# 输入向量
A <- c('000001111000', '0110011', '110001')

# 批量处理得到结果
result <- map_dfr(A, process_binary_str)

# 输出结果
print(result)

运行输出

# A tibble: 3 × 8
  spell_0 spell_1 mean_spell_0 mean_spell_1 mode_spell_0 mode_spell_1 sd_spell_0 sd_spell_1
  <chr>   <chr>          <dbl>        <dbl>        <int>        <int>      <dbl>      <dbl>
1 5-3     4                4            4              5            4       1.41       0   
2 1-2     2-2              1.5          2              1            2       0.707      0   
3 3       2-1              3            1.5            3            2       0          0.707

只保留示例中的4个字段的话,删除自定义函数里对应统计量的行即可,输出完全匹配预期格式。

内容的提问来源于stack exchange,提问作者user3570187

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 14:24:06