【问题标题】:How to split a dataframe of values and use rle on the chunks?如何拆分值的数据帧并在块上使用 rle?
【发布时间】:2019-05-23 21:15:16
【问题描述】:

我正在尝试划分(不一定分成偶数块,bc 实际数据可能会有所不同)一列称为分数(.csv 文件)的整数,然后计算连续值(x 选择值,例如 1)在每个分割的部分或连续值的平均长度。 rle 一切皆有可能。

我可以使用 split 轻松拆分整数列,但这似乎与 rle 不兼容(可能 bc split 会生成一个列表)。我寻找 rle 的解决方案和/或替代方案,但没有提出任何建议。

示例分数

scores <- c(1, 1, 2, 2, 1, 1, 2, 1, 1, 1, 1, 2, 1, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 1, 1, 1, 1, 1, 1)

拆分它们

g <- seq_along(scores)

scores.div <- split(scores, ceiling(g/7))

我尝试过但没有用的示例

Scores.rle <- sapply(scores.div, function(x) {
  r <- rle(x)
  sum(r$values == 1)
})

我希望有这样的输出:

2 2 0 1 1

非常感谢任何帮助

【问题讨论】:

  • 输出结果如您所愿。致电unname(Scores.rle) 删除姓名。

标签: r list split run-length-encoding


【解决方案1】:

我们也可以使用tapply

as.vector(tapply(scores, ceiling(g/7), FUN = function(x) sum(rle(x)$values == 1)))
#[1] 2 2 0 1 1

【讨论】:

    【解决方案2】:

    我运行你的代码,你的代码运行良好。

    > scores <- c(1, 1, 2, 2, 1, 1, 2, 1, 1, 1, 1, 2, 1, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 1, 1, 1, 1, 1, 1)
    > g <- seq_along(scores)
    > scores.div <- split(scores, ceiling(g/7))
    > Scores.rle <- sapply(scores.div, function(x) {
    +   r <- rle(x)
    +   sum(r$values == 1)
    + })
    > Scores.rle
    1 2 3 4 5 
    2 2 0 1 1
    

    我的会话是:

    > sessionInfo()
    R version 3.5.1 (2018-07-02)
    Platform: x86_64-w64-mingw32/x64 (64-bit)
    Running under: Windows >= 8 x64 (build 9200)
    
    Matrix products: default
    
    locale:
    [1] LC_COLLATE=Chinese (Simplified)_China.936  LC_CTYPE=Chinese (Simplified)_China.936   
    [3] LC_MONETARY=Chinese (Simplified)_China.936 LC_NUMERIC=C                              
    [5] LC_TIME=Chinese (Simplified)_China.936    
    
    attached base packages:
    [1] stats     graphics  grDevices utils     datasets  methods   base     
    
    loaded via a namespace (and not attached):
    [1] compiler_3.5.1 tools_3.5.1   
    

    【讨论】:

      【解决方案3】:

      docs 中所述,sapply 根据lapply 创建的列表名称返回一个命名向量:

      sapply 是一个用户友好的版本和lapply 的包装器,默认情况下返回一个向量、矩阵,或者,如果是simplify = "array",则返回一个数组,如果合适的话,通过应用simplify2array()sapply(x, f, simplify = FALSE, USE.NAMES = FALSE)lapply(x, f) 相同

      只需unname 它(查看它的docs)就可以了:

      > scores <- c(1, 1, 2, 2, 1, 1, 2, 1, 1, 1, 1, 2, 1, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 1, 1, 1, 1, 1, 1)
      > g <- seq_along(scores)
      > scores.div <- split(scores, ceiling(g/7))
      > unname(sapply(scores.div, function(x) sum(rle(x)$values ==1)))
      [1] 2 2 0 1 1
      

      【讨论】:

        猜你喜欢
        • 2011-05-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-10-23
        • 1970-01-01
        • 1970-01-01
        • 2010-11-26
        相关资源
        最近更新 更多