2014-05-22 6 views
1

필자는 많은 누락 값을 가지고 매일 관찰하고 각 개인의 벡터를 통해 첫 번째 누락 값을 전파하려고합니다.Carry Last Observation For ID in R

내가 지금까지 한 검색에서 zoo 패키지의 na.locf 기능을 발견했습니다. 그러나 이제는 데이터 프레임의 id 변수를 기반으로이 함수를 조정해야합니다. ddply이 올바른 기능입니까? 그렇다면 동일한 데이터 프레임에 result이라는 새 변수에 출력을 포함시키는 방법을 알아내는 사람이 있습니까?

이것은 내가 지금까지 무엇을 가지고 :

# Load required libraries 
library(zoo) 
library(plyr) 

# Create the data 
data <- structure(list(id = c(1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 
       2, 2, 2), day = c(0, 1, 2, 3, 4, 5, 6, 0, 1, 2, 3, 4, 5, 6, 7, 
       8), value = c("NA", "1", "NA", "NA", "NA", "NA", "NA", "NA", 
       "NA", "NA", "1", "NA", "NA", "NA", "NA", "NA")), .Names = c("id", 
       "day", "value"), row.names = c(NA, -16L), class = "data.frame") 

# Propagate the value of the first non-missing observation in data$value forward for each id 
data$result <- na.locf(data$value, na.rm = FALSE) 

id으로하여 na.locf 기능을 실행하는 방법에 대한 어떤 생각을 크게 감상 할 수있다. 감사!

답변

5

1)가 우선value 컬럼 "NA" 값이 문자 열은 유의하지 NA 값이므로 ##에 그 첫번째 해결 있습니다. 그런 다음 zoo package에서 na.locf을 사용하는 랩퍼 함수 na.locf.na을 작성하십시오. 기본값은 na.rm = FALSE입니다. 마지막으로 적용 할 ave를 사용 na.locfid의 :

library(zoo) 

data2 <- transform(data, value = as.numeric(value)) ## 

na.locf.na <- function(x, na.rm = FALSE, ...) na.locf(x, na.rm = na.rm, ...) 
transform(data2, value = ave(value, id, FUN = na.locf.na)) 

2) 또는 gsubfn package에서 fn를 사용하여이 소형 대안은 더 간결하게 na.locf.na 인라인을 나타내는 이러한 중 하나에서

library(zoo) 
library(gsubfn) 

transform(data2, value = fn$ave(value, id, FUN = ~ na.locf(x, na.rm = FALSE))) 

두 경우 결과는 다음과 같습니다.

id day value 
1 1 0 NA 
2 1 1  1 
3 1 2  1 
4 1 3  1 
5 1 4  1 
6 1 5  1 
7 1 6  1 
8 2 0 NA 
9 2 1 NA 
10 2 2 NA 
11 2 3  1 
12 2 4  1 
13 2 5  1 
14 2 6  1 
15 2 7  1 
16 2 8  1 

3) 우리는 번갈아 위에서 na.locf.na를 사용하여 동물원과 함께 dplyr 사용할 수 있습니다

library(zoo) 
library(dplyr) 

data2 <- data %>% mutate(value = as.numeric(value)) # fix value column 
data2 %>% group_by(id) %>% mutate(value = na.locf.na(value)) 

dplyr from CRAN 여기서 일 GitHub의에서 한 시도하지 않는 경우

library(devtools) 
install_github("hadley/dplyr") 

개정을 개편 프레젠테이션 및 대안을 추가했습니다.

+0

절대적으로 완벽한 - 감사합니다! 이전에'transform' 함수를 사용 해본 적이 없지만 확실히 살펴 보겠습니다. 다시 한번 감사드립니다. – Entropy