繁体   English   中英

在R中使用rle简化lapply函数

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM