[英]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
循環的方法或使用sapply
上sapply
-我創建了一個大樣本(每三個傳感器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.