2017-04-11 1 views
2

: 나는 1 사이의 'NA'에 채울 수있는 방법R - 채우기 빈 변수를 감안할 때

v1 <- c(1,NA,1,NA,NA) 
v2 <- c(NA,NA,1,NA,1) 
df <- data.frame(rbind(v1, v2)) 

R> df 
X1 X2 X3 X4 X5  
1 NA 1 NA NA 
NA NA 1 NA 1 

?

는 그래서는 다음과 같습니다 것을 : 우리는 MARGIN=1apply으로 행을 통해 반복하여이 작업을 수행 할 수 있습니다

X1 X2 X3 X4 X5 
1 1 1 NA NA 
NA NA 1 1 1 
+0

이렇게하는 방법은 여러 가지가 있습니다. 너 뭐 해봤 니? –

+0

각 행에는 값이 1 인 열이 2 개만 있습니까? 1을 더 가질 가능성이 있습니까? 1s가 적습니까? 이 경우 어떤 행동을 원하십니까? – A5C1D2H2I1M1N2O1R2T1

+0

가장 단순한 경우를 생각해 봅시다. 각 행에는 2 개의 값 1이 있습니다. 그들은 인접한 곳 (손길이 닿지 않은 채로있을 수 있음)과 값이없는 곳 사이에있을 수 있습니다. 감사! – kquach

답변

1

내가 당신의 데이터 세트가 얼마나 큰 모른다 , 아마 당신은 더 긴 접근법을 취할 수 있고, 다음 :

옵션 1 : arr.ind을 사용하십시오.

library(data.table) 
myFun1 <- function(indf) { 
    M <- as.matrix(data.table(which(indf == 1, arr.ind = TRUE))[ 
    , list(col = seq.int(min(col), max(col))), row]) 
    indf[M] <- 1 
    indf 
} 
myFun1(df)  

옵션 2 : max.col을 사용하십시오.

myFun2 <- function(indf) { 
    indf2 <- replace(indf, is.na(indf), 0) 
    mins <- max.col(indf2, "first") 
    maxs <- max.col(indf2, "last") 
    L <- Map(seq.int, mins, maxs) 
    mat <- cbind(rep(seq_along(L), lengths(L)), unlist(L, use.names = FALSE)) 
    indf[mat] <- 1 
    indf 
} 
myFun2(df) 

다양한 크기의 데이터로 테스트 해보십시오. 여기에 데이터를 만들기 위해 하나의 접근 방식 :

set.seed(1) 
nc <- 50 
nr <- 10000 
df <- data.frame(t(replicate(nr, sample(c(1, 1, rep(NA, nc-2)))))) 

일부 샘플 출력 및 타이밍 비교를 this Gist를 참조하십시오.

+0

그냥 옵션 2 나를 위해 일했다. 감사! – kquach

2

. 첫 번째 및 마지막 비 NA 요소의 인덱스를 찾고 첫 번째 비 -NA 요소와 사이의 요소를 변경하고 출력을 조 변경 한 다음 다시 데이터 집합에 할당합니다.

df[] <- t(apply(df, 1, function(x) { 
     st <- range(which(!is.na(x))) 
      x[st[1]:st[2]] <- x[st[1]] 
      x})) 
2

dplyr에서 laglead 기능의 사용과 MARGIN=2 또 다른 apply 솔루션 :

library(dplyr) 


v1 <- c(1,NA,1,NA,NA) 
v2 <- c(NA,NA,1,NA,1) 
dff <- data.frame(rbind(v1, v2)) 

apply(t(dff), 2, function(x) { 
    conds <- rowSums(cbind(x, lag(x), lead(x)), na.rm = T)==2 
    x[conds] <- 1 
    x 
}) %>% t() 

출력 :

# X1 X2 X3 X4 X5 
# v1 1 1 1 NA NA 
# v2 NA NA 1 1 1 
+0

주어진 예제로는 작동하지만, 일반적으로는 작동하지 않는 것 같습니다. – A5C1D2H2I1M1N2O1R2T1

+0

누군가 내 이전 의견에 궁금한 점이 있으시면 https://gist.github.com/mrdwab/048f4323217bade1168a9b3dff521b22를 확인하십시오. – A5C1D2H2I1M1N2O1R2T1