【问题标题】:R data frame - finding length of streak [duplicate]R数据框 - 找到条纹的长度[重复]
【发布时间】:2014-05-07 14:35:52
【问题描述】:

我有一个只有 1 行的 R 数据框,看起来像这样:

x1 x2 x3 x4 x5 x6 x7 x8 x9 x10
 1  1  1  1  0  1  0  1  0  0

我想知道从第一个位置开始连续有多少个 1。所以这将是 4。

更多示例:

(示例 1)

x1 x2 x3 x4 x5 x6 x7 x8 x9 x10
 0  1  1  1  0  1  0  1  0  0

会是 0,因为第一个位置甚至不是 1。

(示例 2)

x1 x2 x3 x4 x5 x6 x7 x8 x9 x10
 1  0  1  1  0  1  0  1  0  0

应该是 1。

我该如何实现?

numInStreakAtBeginning = function(row) {

}

此外,我如何实现一个无论从哪里开始都查找最大条纹的方法?例如,

x1 x2 x3 x4 x5 x6 x7 x8 x9 x10
 1  0  1  1  1  1  0  1  0  0

应该是 3。

【问题讨论】:

  • 可能你想要?rle
  • 对,但我如何指定 rle 必须从哪里开始以及它必须采用什么值。或者更进一步,它可以从任何地方开始,但必须具有一定的价值。
  • 您可以从rle 的输出中推断出所有这些,这将计算所有值的所有运行。
  • 第一个问题:r <- rle(row) ; ifelse(r$values[1] == 1, r$lengths[1], 0)。第二个问题:r <- rle(row) ; max(r$lengths[r$values == 1]).
  • @rbatt 从rle 输出到最终解决方案的命令很短(每个都是单行)且简单(ifelse 并根据另一个向量的值索引一个向量)。鉴于使用 rle 输出回答问题的简单性,这对我来说似乎是重复的。

标签: r dataframe


【解决方案1】:

函数返回一个长度为 2 的列表,列表的第一个元素是 1 的起始条的长度,第二个元素是 1 的最长条的长度。

test <- as.data.frame(matrix(rbinom(20, 1, 0.5), nrow=1))

numInStreakAtBeginning <- function(row){
    runs <- rle(row[1,]) # convert to vector
    retList <- list() # store output

    if(!runs$values[1]){ # if the first value is 0, the length of the first streak is 0
        retList$firstStreak <- 0
    }else{
        retList$firstStreak <- runs$lengths[1] # if the first value is not 0, return length of first streak
    }

    retList$longestStreak <- max(runs$lengths[runs$values==1L]) # the longest streak of 1's, regardless of starting point

    return(retList)
}

numInStreakAtBeginning(test)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-05-27
    • 1970-01-01
    • 2021-01-03
    • 1970-01-01
    • 2021-08-23
    • 2013-08-14
    • 1970-01-01
    相关资源
    最近更新 更多