在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)
我有一个向量列表,我想要做的是找到连续的最大整数量&gt; 120&lt;&lt; 120&lt; 120.这将输出两个单独的列表,一个用于GOOD(&lt; 120),一个用于BAD(&gt; 120)。
因此GOOD的最佳输出(连续最大值<120)如下所示:
[[1]]
[1] 13
[[2]]
[1] 4
[[3]]
[1] 7
和BAD(连续最多> 120)这样:
[[1]]
[1] 2
[[2]]
[1] 1
[[3]]
[1] 1
我现在试图解决这个问题似乎效率非常低。我正在设置所有&lt; 120 == 1和一切&gt; 120 == 0.然后我试图找到连续发现了多少个零和使用rle多少个零,最后取出最大值。我在想,也许这一切都可以用rle,lapply以及哪种方式完成。也许类似的东西(但目前不起作用):
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))
答案 0 :(得分:2)
两件事:首先,rle(x < k)
会为您提供两者的长度小于k
且运行&gt; = k
。其次,由于rle
的输出是一个列表,因此您需要在排序rle_out$lengths
之后找到rle_out$values
中的最大值(1
时的值x
{1}}小于k
,否则小于0
。
更像max(rle_out$lengths[rle_out$values==1])
,再次使用零而不是1
来获得“好”和“坏”。
将其放入Matthew P的lapply
,你可能已经完成了。
答案 1 :(得分: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