【问题标题】:Streamlining lapply function with rle in R在 R 中使用 rle 简化 lapply 函数
【发布时间】:2013-11-05 04:03:54
【问题描述】:

在 R 中,请考虑这个示例列表:

x <- c(0,0,6,25,1,3,2,8,45,27,3,45,64,170,2,47,155,153,65,131,119,57,150,50,122,105,136,112,20,162,35,12,149,18,0)
y <- c(173,30,168,3,10,34,20,172,17,165,73,53,40,141)
z <- c(2,6,3,173,15,5,13,29,14,7,33,173,8,44,112,11,165)
testList <- list(x,y,z)

我有一个向量列表,我想做的是找到连续整数的最大数量,这些整数大于 120 且小于 120。这将输出两个单独的列表,一个用于 GOOD(120)。

所以 GOOD 的期望输出(连续的最大值

[[1]]
 [1]  13  

[[2]]
 [1]  4

[[3]]
 [1]  7

和这样的 BAD(最多连续 > 120):

[[1]]
 [1]  2  

[[2]]
 [1]  1

[[3]]
 [1]  1

我目前试图解决这个问题的方法似乎非常低效。我正在设置所有 120 == 0 的内容。然后我试图找出连续找到多少个零以及使用 rle 找到多少个零,最后取其中的最大值。我在想也许这一切都可以通过 rle、lapply 和 which 以某种方式完成。也许是这样的(但它目前不起作用):

rleTest <- lapply(testList,rle) ##Use this to find out
BAD <- rleTest$lengths[rleTest$values>120]#how many of same number are in a row
GOOD <- rleTest$lengths[rleTest$values<120]
BADList <- list(max(BAD))
GOODList <- list(max(GOOD))

【问题讨论】:

    标签: r lapply


    【解决方案1】:

    两件事:首先,rle(x &lt; k) 会为您提供 both 小于 k 的运行和运行 >= k 的长度。其次,由于rle 的输出是一个列表,您将希望在按rle_out$values 排序后找到rle_out$lengths 中的最大值(当x 小于k 时,它将具有1 的值0 否则)。

    更像max(rle_out$lengths[rle_out$values==1]) 并再次用零代替1 以获得“好”和“坏”。

    把它放到 Matthew P 的lapply 中,你可能就准备好了。

    【讨论】:

      【解决方案2】:

      试试这样的:

      GOOD <- lapply(testList, function(v) with(rle(v < 120), max(lengths[values])))
      # [[1]]
      # [1] 13
      # 
      # [[2]]
      # [1] 4
      # 
      # [[3]]
      # [1] 7
      
      BAD <- lapply(testList, function(v) with(rle(v < 120), max(lengths[!values])))
      
      # [[1]]
      # [1] 2
      # 
      # [[2]]
      # [1] 1
      # 
      # [[3]]
      # [1] 1
      

      【讨论】:

      • 我相信这会失败,因为 rle$lengths 中的最大值可能是“好”或“坏”
      • 我采用的是 lengths 向量的适当子集的 max,但不是全部。
      • 哎呀,原来如此。对此感到抱歉。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-09-01
      • 1970-01-01
      • 2016-05-18
      • 1970-01-01
      • 2013-02-14
      • 1970-01-01
      • 2022-01-23
      相关资源
      最近更新 更多