簡體   English   中英

GNU R:在sapply上使用sapply

[英]GNU R:Use sapply on sapply

我有一份狀態清單。 每個列表元素都包含一天中每一分鍾的傳感器狀態(1440個條目,0或1)。 該列表包含所有傳感器。

例如, statuses[[3]]給出具有1440個條目的向量,其中包含每分鍾的所有0和1。

假設在第800分鍾,所有傳感器的狀態為:

sapply(statuses,'[',800)

我想獲取每分鍾活動傳感器的數量(即顯示1個)。 我怎么做? 不知何故,人們不得不在此周圍放置另一個sapply()

使用for循環的解決方案如下所示

status_ones <- rep(0,1440)
for (k in 1:1440){
  status_ones[k] <- sum(sapply(statuses,'[',k))
}

在我看來,有幾種方法可以實現您想要的目標; 這是我首先想到的:由於列表中每個元素的長度相同,因此可以將其視為數據框並使用apply。 我在下面使用模擬數據說明這種方法,我認為該模擬數據與您對數據的描述相匹配(這將用於三個傳感器的五個觀測值):

set.seed(42)
statuses <- lapply(1:3, function(x) sample(0:1, 5, replace=TRUE))
statuses
# [[1]]
# [1] 1 1 0 1 1
# 
# [[2]]
# [1] 1 1 0 1 1
# 
# [[3]]
# [1] 0 1 1 0 0
status_ones <- apply(as.data.frame(statuses), 1, sum)
status_ones
# [1] 2 3 1 2 2

您可以通過這個小示例輕松地手動確認這是否提供了所需的結果。 下面你可以看到相對於這種方法的速度優勢for循環的方法或使用sapplysapply -我創建了一個大樣本(每三個傳感器1440條意見),並使用benchmark看到速度的差異:

library(rbenchmark)
statuses <- lapply(1:3, function(x) sample(0:1, 1440, replace=TRUE))
benchmark(apply=apply(as.data.frame(statuses), 1, sum),
          sapply=sapply(1:1440, function(x) sum(sapply(statuses, '[', x))),
          loop=for ( i in 1:1440 ) { sum(sapply(statuses, '[', i)) },
          columns=c('test', 'elapsed', 'relative', 'user.self'),
          order='relative')
    test elapsed relative user.self
1  apply   0.883    1.000     0.660
2 sapply   6.115    6.925     5.616
3   loop   6.305    7.140     5.776

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM