2017-10-23 5 views
2

큰 데이터 프레임, 약 2600 개의 관측치가있는 300+ 열 (시계열)이 있습니다. 열은 많은 NA와 짧은 시간 시리즈로 채워지고 일반적으로 NA는 다시 나타납니다. 각 열의 첫 번째 비 NA 값을 찾고 NA로 바꾸고 싶습니다.R : 데이터 프레임 : NA의 첫 번째 비 NA 값을

하기 전에 :

x1 x2 x3 x4 
1 NA NA NA NA 
2 NA NA NA NA 
3 1 1 NA NA 
4 2 2 1 1 
5 3 3 2 2 
6 4 4 3 3 
7 5 5 4 4 
8 6 6 5 5 
9 7 7 6 6 
10 8 8 7 7 
11 9 9 NA NA 
12 10 10 NA NA 
13 NA NA NA NA 
14 NA NA NA NA 

후 :

x1 x2 x3 x4 
1 NA NA NA NA 
2 NA NA NA NA 
3 NA NA NA NA 
4 2 2 NA NA 
5 3 3 2 2 
6 4 4 3 3 
7 5 5 4 4 
8 6 6 5 5 
9 7 7 6 6 
10 8 8 7 7 
11 9 9 NA NA 
12 10 10 NA NA 
13 NA NA NA NA 
14 NA NA NA NA 

나는 주위 검색과 발견했습니다

나는 단지 훨씬 더 큰 dataframe으로 달성하기 바라고 무엇인가 각 열에 대해이 작업을 수행하는 방법이지만 전체 데이터 프레임에 적용하려는 노력은 어렵습니다.

내 원래 dataframe 재현 예시 dataframe을 만들었다 :이 (@Joshua 울리히 here 의해 제공) 1 열에 NA와 제 1 값을 대체 사용한

#Dataframe with NA 
x1=x2=c(NA,NA,1:10,NA,NA) 
x3=x4=c(NA,NA,NA,1:7,NA,NA,NA,NA) 
df=data.frame(x1,x2,x3,x4) 

을 그러나 싶습니다 내가 함수로 위를 설정하고 apply/lapply로 모든 열에 대해 실행하는 것을 시도했다

NonNAindex <- which(!is.na(df[,1])) 
firstNonNA <- min(NonNAindex) 
is.na(df[,1]) <- seq(firstNonNA, length.out=1) 

뿐만 아니라: 수동 300 개 + 코드를 변경하지 않고 모든 컬럼에 적용합니다반복하지만, 내 데이터 프레임에 변경 사항을 적용하는 방법을 실제로 파악하지 못했습니다. 나는 내가 R에서 처음으로 작은 걸음을 들기 때문에 내가 간과 한 어떤 것이 있다고 확신한다.

모든 제안을 매우 높이 평가할 것입니다!

답변

4

우리는 base R

df1[] <- lapply(df1, function(x) replace(x, which(!is.na(x))[1], NA)) 
df1 
# x1 x2 x3 x4 
#1 NA NA NA NA 
#2 NA NA NA NA 
#3 NA NA NA NA 
#4 2 2 NA NA 
#5 3 3 2 2 
#6 4 4 3 3 
#7 5 5 4 4 
#8 6 6 5 5 
#9 7 7 6 6 
#10 8 8 7 7 
#11 9 9 NA NA 
#12 10 10 NA NA 
#13 NA NA NA NA 
#14 NA NA NA NA 

를 사용하거나 @thelatemail 나는이 현저하게 빨리 아무것도 올 수없는 최선의 노력에도 불구하고

df1[] <- lapply(df1, function(x) replace(x, Position(Negate(is.na), x), NA)) 
+1

을 제안 할 수 있습니다. 어쩌면'df [] lapply (df, function (x) replace (x, Position (Neg. (is.na), x), NA))'가 좋을 수도 있습니다. 이는 약간의 오버 헤드를 추가하고 'df [] <- Map (replace, df, lapply (df, Position, f = Negate (is.na)), NA)' – thelatemail

1

모든 열에 대해이 작업을 수행하려는 경우 dplyr에서 mutate_all 함수를 사용할 수 있습니다. 자세한 내용은 http://dplyr.tidyverse.org/을 참조하십시오. 특히, here으로 표시된 몇 가지 예제를 살펴볼 수 있습니다.

library(dplyr) 
mutate_all(df, funs(if_else(row_number() == min(which(!is.na(.))), NA_integer_, .))) 
#> x1 x2 x3 x4 
#> 1 NA NA NA NA 
#> 2 NA NA NA NA 
#> 3 NA NA NA NA 
#> 4 2 2 NA NA 
#> 5 3 3 2 2 
#> 6 4 4 3 3 
#> 7 5 5 4 4 
#> 8 6 6 5 5 
#> 9 7 7 6 6 
#> 10 8 8 7 7 
#> 11 9 9 NA NA 
#> 12 10 10 NA NA 
#> 13 NA NA NA NA 
#> 14 NA NA NA NA 
관련 문제