[英]Streamlining lapply function with rle in R
在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),另一个用于对于BAD(> 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和哪种方式完成。 可能是这样的(但是当前不起作用):
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))
两件事情:第一, rle(x < k)
会给你两个运行小于的长度k
和运行> = k
。 其次,由于rle
的输出是一个列表,因此您需要在按rle_out$values
排序后在rle_out$lengths
找到最大值(当x
小于k
时,其值为1
,否则为0
)。
更像是max(rle_out$lengths[rle_out$values==1])
,再次用0而不是1
来获得“ GOOD”和“ BAD”。
把它丢进Matthew P的lapply
,你可能就被定了。
尝试这样的事情:
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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.