在 R 中,使用 rle(运行长度编码)的结果,包括命名的行和列标题

Posted

技术标签:

【中文标题】在 R 中,使用 rle(运行长度编码)的结果,包括命名的行和列标题【英文标题】:In R, using results of rle (Run Length Encoding) including named row and column headers 【发布时间】:2016-05-26 03:43:12 【问题描述】:

我有一个大型矩阵,其中包含公司作为行名、月份作为列名以及每个元素的数据。测试数据如下:

testmatrix<-matrix(c(1,0,0,0,10,5,5,5,5,5,2,2,0,0,0,0,0,1,1,1),nrow=4,ncol=5,byrow=TRUE)
colnames(testmatrix)<-c("Jan","Feb","Mar","Apr","May")
rownames(testmatrix)<-c("Company1","Company2","Company3","Company4")
progression<-apply(testmatrix,1,rle)
progression

progress 对象是应用于矩阵每一行的 rle 函数的输出。结果是一个包含 2 个元素的列表,它们都属于“rle”类。我想:

    了解如何输出(在 R 中)Company1 的 4x3(逐列)矩阵,如下所示:

因此我很难理解如何处理progression 提供的输出

    progression 导出到excel 以供进一步分析(最好采用上面(1)中的格式(包括列和行标题(在列表输出中它们被称为:attr(*,"names")))。

非常感谢您的帮助!

【问题讨论】:

感谢 TLM 的帮助。 【参考方案1】:

这不是特别优雅,但确实可以:

format_rle <- function(rle, rn)
  l <- list(rle$lengths,
    names(rle$lengths),
    rle$values,
    names(rle$values))
  m <- as.matrix(do.call(rbind, l))
  colnames(m) <- NULL
  rownames(m) <- rep(rn, nrow(m))
  m

试试format_rle(progression[[1]], "foo") 了解一下:

[,1]  [,2]  [,3] 
foo "1"   "3"   "1"  
foo "Feb" "May" ""   
foo "1"   "0"   "10" 
foo "Jan" "Apr" "May"

然后,我们将此函数应用于进程中的所有元素,并将结果保存到根据进程名称命名的单个 csv 文件中。您的工作目录中应该有 a bunch of .csv 文件(getwd() 打印它)。

for (i in seq_along(progression))
  write.csv(format_rle(progression[[i]], names(progression)[i]),
            file=paste0(names(progression[i]), ".csv"))

这是你想要的吗?

【讨论】:

文森特,我应该叫你 Mon homme 代替 Bonhomme。优秀的答案。实际上,我应该更具体地回答我的问题,因为我还想要一个完整的 excel 输出(我有 2000 多家公司),所以创建 2000 个 csv 文件是不切实际的。所以这是我调整后的代码,用于将所有内容放入 1 个文件中:for (i in seq_along(progression)) write.table(format_rle(progression[[i]], names(progression)[i]), file="append.csv",append=T,sep=",",col.names=F)。那是给其他人的;我敢肯定,如果我表达正确,您也会提供它。再次感谢

以上是关于在 R 中,使用 rle(运行长度编码)的结果,包括命名的行和列标题的主要内容,如果未能解决你的问题,请参考以下文章

算法题:RLE压缩算法(游程编码)的Java实现

算法题:RLE压缩算法(游程编码)的Java实现

行程长度编码的RLE 压缩算法的基本原理

运行长度编码运行是不是可以超越像素数据行

6.2RLE算法的机制

fastparquet:如何禁用 rle 编码