2014-02-07 6 views
1

여러 개의 열이있는 데이터 프레임이 있습니다. 하나의 열에 대해서는 누적 합계를 계산하고 싶습니다만 누락 된 값에 문제가 있습니다. NA 이후 다시 시작하는 누적 값

-1.2 3.4 -4.9 0.1 8.1 9.1 7.1 NA NA NA -3 2.1 4 

는이 작업을 수행 할 수 있습니다

#sample data 
test <- c(-1.2, 4.6, -8.3, 5, 8, 1, -2, NA, NA, NA, -3, 5.1, 1.9) 
test <- as.data.frame(test) 

#This gives NA after NAs occurred 
sum_test <- lapply(test, FUN=cumsum) 

sum_test 
$test 
[1] -1.2 3.4 -4.9 0.1 8.1 9.1 7.1 NA NA NA NA NA NA 

#This continues with adding to pre-NA value after last NA 
sum_test <- lapply(test, function(x) ave(x, is.na(x), FUN=cumsum)) 

sum_test 
$test 
[1] -1.2 3.4 -4.9 0.1 8.1 9.1 7.1 NA NA NA 4.1 9.2 11.1 

그러나, 내가 무엇을 달성하고자하는 것은의 NAS cumsum가 시작됩니다 후이다?

답변

3

이 트릭을 수행해야합니다

test <- c(-1.2, 4.6, -8.3, 5, 8, 1, -2, NA, NA, NA, -3, 5.1, 1.9) 
tmp <- rle(is.na(test)) 
ind <- rep(seq_along(tmp$value), tmp$lengths) 
as.vector(unlist(tapply(test, ind, cumsum))) 
5
여기

g는 그룹화 변수를 정의하고 우리는 각 그룹을 통해 별도로 cumsum을 적용

test <- c(-1.2, 4.6, -8.3, 5, 8, 1, -2, NA, NA, NA, -3, 5.1, 1.9) 
g <- cumsum(is.na(head(c(0, test), -1))) 
ave(test, g, FUN = cumsum) 

제공 :

[1] -1.2 3.4 -4.9 0.1 8.1 9.1 7.1 NA NA NA -3.0 2.1 4.0 

추가 :head(c(0, test), -1)이 너무 dplyr의 lag 기능이 약간이를 단축하는 데 사용할 수 test 지연 참고 :

library(dplyr) 
ave(test, cumsum(is.na(lag(test))), FUN = cumsum) 
+0

이 중대하다. 동일한 문제에 대해 'na.omit'을 사용할 수 있습니까? –

+0

'na.omit'는 전형적으로 입력보다 짧은 벡터를 출력하므로 여기서 유용하지는 않습니다. –