首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >GNU R:在上使用sapply

GNU R:在上使用sapply
EN

Stack Overflow用户
提问于 2017-09-28 09:50:50
回答 1查看 199关注 0票数 0

我有一份状态清单。每个list元素包含一天中每分钟的传感器状态(1440个条目,0或1)。该列表包含所有传感器。

例如,statuses[[3]]给出一个包含1440个条目的向量,其中包含每分钟的所有0和1。

比如说,800分钟内所有传感器的状态是:

代码语言:javascript
复制
sapply(statuses,'[',800)

我想知道每分钟活动感应器的数目(即显示一个)。我该怎么做?不知怎么的,我们得把另一个sapply()放在这里.

使用for循环的解决方案如下所示

代码语言:javascript
复制
status_ones <- rep(0,1440)
for (k in 1:1440){
  status_ones[k] <- sum(sapply(statuses,'[',k))
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-09-28 11:27:05

在我看来,有几种方法可以实现您想要的东西;这就是首先跳出来的地方:由于列表中每个元素的长度是相同的,所以您可以将其作为一个数据框架来处理并使用。下面我使用模拟数据说明了这种方法,我认为这些数据与您对数据的描述相匹配(这将用于三个传感器的五个观测):

代码语言:javascript
复制
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查看速度差异:

代码语言:javascript
复制
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
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46466103

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档