2017-09-28 1 views
0

상태 목록이 있습니다. 각 목록 요소에는 1 분당 센서 상태 (1440 항목, 0 또는 1)가 포함됩니다. 목록에는 모든 센서가 포함됩니다.GNU R : sapply에 sapply 사용

예를 들어, statuses[[3]]은 각 분의 0과 1을 모두 포함하는 1440 개의 항목이있는 벡터를 제공합니다.

의 모든 센서의 상태, 분 (800)는, 이제 가정 해 봅시다 :

sapply(statuses,'[',800) 

내가 분당 (즉, 1을 표시) 활성 센서의 수를 좀하고 싶습니다. 어떻게해야합니까? 어떻게 든 하나

for 루프 당신이 원하는 것을 달성하기 위해 여러 가지 방법이 있습니다 날 것으로 보인다이

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

답변

1

과 같을 것이다 사용하는 솔루션 ...이 주변의 다른 sapply()을 넣어 가지고; 이것이 내가 먼저 뛰어 내린 것입니다. 목록의 각 요소의 길이가 동일하기 때문에이를 데이터 프레임으로 처리하고 적용을 사용할 수 있습니다. 나는 데이터의 귀하의 설명과 일치 생각 시뮬레이션 데이터를 사용하여 아래에이 방법을 보여줍니다 (이 세 가지 센서의 다섯 명 관찰을위한 것) :

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를 사용하여이 접근의 속도의 혜택을 볼 수 아래 - 나는 큰 샘플 (1,440 관찰 세 가지 센서의 각)를 생성 속도 차이를 볼 수 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