如何从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
相关产品推荐
相关产品推荐

