使用R中的rle来简化lapply函数

时间:2013-11-04 19:41:16

标签: r lapply

在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))

2 个答案:

答案 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