如何将Run Length Encoding(RLE)转换后的观测数据转为常规表格数据集
将游程编码(RLE)观测数据转换为常规表格形式
我有通过**游程编码(Run Length Encoding,RLE)**生成的观测数据,示例代码如下:
set.seed(1) make_data <- function() { series <- rnorm(sample(10:50,1)) |> cumsum() |> sign() accelerometry::rle2(series, indices = T) } my_obs <- lapply(1:5, \(x) make_data()) names(my_obs) <- paste("observation", 1:length(my_obs))
运行后得到的观测数据结果:
my_obs $`observation 1` value start stop length [1,] -1 1 3 3 [2,] 1 4 5 2 [3,] -1 6 6 1 [4,] 1 7 30 24 $`observation 2` value start stop length [1,] 1 1 5 5 [2,] -1 6 8 3 [3,] 1 9 30 22 $`observation 3` value start stop length [1,] 1 1 30 30 $`observation 4` value start stop length [1,] -1 1 1 1 [2,] 1 2 12 11 [3,] -1 13 15 3 [4,] 1 16 30 15 $`observation 5` value start stop length [1,] -1 1 1 1 [2,] 1 2 9 8 [3,] -1 10 30 21
请问如何将这些数据转换为常规表格形式的数据集,且保证不丢失任何信息?若不了解游程编码,可查看帮助文档:?rle、?accelerometry::rle2
解决方案
由于每个观测包含多个游程编码段,要保留所有信息的常规表格形式应为长格式表格:每行对应一个游程段,同时标记所属的观测。以下提供两种实现方式:
方法1:使用tidyverse工具包
library(tidyverse) # 定义转换函数 convert_rle_to_table <- function(rle_list) { rle_list %>% imap_dfr(function(mat, obs_name) { # 将矩阵转为数据框,添加观测名称列 as.data.frame(mat) %>% mutate(observation = obs_name) }) %>% # 调整列顺序,将观测标识列放在最前 select(observation, everything()) } # 执行转换 my_obs_table <- convert_rle_to_table(my_obs) # 查看结果 print(my_obs_table)
方法2:使用基础R实现
# 遍历每个观测,转换为带标识的数据框后合并 my_obs_table <- do.call(rbind, lapply(names(my_obs), function(obs_name) { df <- as.data.frame(my_obs[[obs_name]]) df$observation <- obs_name return(df) })) # 调整列顺序 my_obs_table <- my_obs_table[, c("observation", "value", "start", "stop", "length")] # 查看结果 print(my_obs_table)
两种方法最终得到的表格都完整保留了原始数据的value(游程值)、start(起始位置)、stop(结束位置)、length(游程长度)信息,同时通过observation列标记每个游程段所属的观测。
内容的提问来源于stack exchange,提问作者mr.T
相关产品推荐
相关产品推荐

