0

在 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),一个用于坏(> 120)。

因此 GOOD 的期望输出(连续最大值 < 120)如下所示:

[[1]]
 [1]  13  

[[2]]
 [1]  4

[[3]]
 [1]  7

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

[[1]]
 [1]  2  

[[2]]
 [1]  1

[[3]]
 [1]  1

我目前试图解决这个问题的方式似乎非常低效。我正在设置所有 < 120 == 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))
4

2 回答 2

2

两件事:首先,rle(x < k)将为您提供运行小于k和运行 >=的长度k。其次,由于 的输出是一个列表,您将希望在排序后rle找到最大值(当小于时将具有值,否则将具有值)。rle_out$lengthsrle_out$values1xk0

更像是max(rle_out$lengths[rle_out$values==1]) 一次又一次地用零而不是1同时获得“好”和“坏”。

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

于 2013-11-04T20:00:07.147 回答
1

尝试这样的事情:

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
于 2013-11-04T19:49:13.657 回答