행렬 - R 데이터 프레임에서 NA 값을 0으로 대체하려면 어떻게해야합니까?




인자 가 수치 형 또는 논리 형 이 아니므 로 na 를 반환 합니다 (10)

@ gsk3 답변에 대한 내 의견을 참조하십시오. 간단한 예 :

> m <- matrix(sample(c(NA, 1:10), 100, replace = TRUE), 10)
> d <- as.data.frame(m)
   V1 V2 V3 V4 V5 V6 V7 V8 V9 V10
1   4  3 NA  3  7  6  6 10  6   5
2   9  8  9  5 10 NA  2  1  7   2
3   1  1  6  3  6 NA  1  4  1   6
4  NA  4 NA  7 10  2 NA  4  1   8
5   1  2  4 NA  2  6  2  6  7   4
6  NA  3 NA NA 10  2  1 10  8   4
7   4  4  9 10  9  8  9  4 10  NA
8   5  8  3  2  1  4  5  9  4   7
9   3  9 10  1  9  9 10  5  3   3
10  4  2  2  5 NA  9  7  2  5   5

> d[is.na(d)] <- 0

> d
   V1 V2 V3 V4 V5 V6 V7 V8 V9 V10
1   4  3  0  3  7  6  6 10  6   5
2   9  8  9  5 10  0  2  1  7   2
3   1  1  6  3  6  0  1  4  1   6
4   0  4  0  7 10  2  0  4  1   8
5   1  2  4  0  2  6  2  6  7   4
6   0  3  0  0 10  2  1 10  8   4
7   4  4  9 10  9  8  9  4 10   0
8   5  8  3  2  1  4  5  9  4   7
9   3  9 10  1  9  9 10  5  3   3
10  4  2  2  5  0  9  7  2  5   5

신청을 apply 필요가 없습니다. =)

편집하다

또한 norm 패키지를 살펴 봐야합니다. 그것은 누락 된 데이터 분석을위한 좋은 기능이 많이 있습니다. =)

데이터 프레임이 있고 일부 열에는 NA 값이 있습니다.

NA 값을 0으로 대체하려면 어떻게합니까?


@ ianmunoz의 게시물에 댓글을 달았 겠지만 충분한 평판이 없습니다. dplyrmutate_eachreplace 를 결합하여 NA0 보충 할 수 있습니다. @ aL3xa의 답변에서 데이터 프레임을 사용하여 ...

> m <- matrix(sample(c(NA, 1:10), 100, replace = TRUE), 10)
> d <- as.data.frame(m)
> d

    V1 V2 V3 V4 V5 V6 V7 V8 V9 V10
1   4  8  1  9  6  9 NA  8  9   8
2   8  3  6  8  2  1 NA NA  6   3
3   6  6  3 NA  2 NA NA  5  7   7
4  10  6  1  1  7  9  1 10  3  10
5  10  6  7 10 10  3  2  5  4   6
6   2  4  1  5  7 NA NA  8  4   4
7   7  2  3  1  4 10 NA  8  7   7
8   9  5  8 10  5  3  5  8  3   2
9   9  1  8  7  6  5 NA NA  6   7
10  6 10  8  7  1  1  2  2  5   7

> d %>% mutate_each( funs_( interp( ~replace(., is.na(.),0) ) ) )

    V1 V2 V3 V4 V5 V6 V7 V8 V9 V10
1   4  8  1  9  6  9  0  8  9   8
2   8  3  6  8  2  1  0  0  6   3
3   6  6  3  0  2  0  0  5  7   7
4  10  6  1  1  7  9  1 10  3  10
5  10  6  7 10 10  3  2  5  4   6
6   2  4  1  5  7  0  0  8  4   4
7   7  2  3  1  4 10  0  8  7   7
8   9  5  8 10  5  3  5  8  3   2
9   9  1  8  7  6  5  0  0  6   7
10  6 10  8  7  1  1  2  2  5   7

우리는 여기서 표준 평가 (SE)를 사용하고 있습니다. 그래서 " funs_ "에 밑줄이 필요합니다. 우리는 또한 lazyevalinterp / ~ lazyeval 사용합니다 . "우리가 작업하고있는 모든 것", 즉 데이터 프레임을 참조합니다. 이제 0이 있습니다!


여러 개의 열에서 작동하는 tidyr 메소드 replace_na 가있는 다른 dplyr 파이프 호환 옵션 :

require(dplyr)
require(tidyr)

m <- matrix(sample(c(NA, 1:10), 100, replace = TRUE), 10)
d <- as.data.frame(m)

myList <- setNames(lapply(vector("list", ncol(d)), function(x) x <- 0), names(d))

df <- d %>% replace_na(myList)

예를 들어 숫자 열로 쉽게 제한 할 수 있습니다.

d$str <- c("string", NA)

myList <- myList[sapply(d, is.numeric)]

df <- d %>% replace_na(myList)

예 :

library(dplyr)

df1 <- df1 %>%
    mutate(myCol1 = if_else(is.na(myCol1), 0, myCol1))

참고 : 이 작업은 선택된 열에 적용됩니다. 모든 열에 대해이 작업을 수행해야하는 경우 mutate_each를 사용하여 mutate_each 의 대답을 참조하십시오.


요인 변수에서 NA를 대체하려면 다음과 같이 유용 할 수 있습니다.

n <- length(levels(data.vector))+1

data.vector <- as.numeric(data.vector)
data.vector[is.na(data.vector)] <- n
data.vector <- as.factor(data.vector)
levels(data.vector) <- c("level1","level2",...,"leveln", "NAlevel") 

요인 벡터를 숫자 벡터로 변환하고 또 다른 인공적 인 수치 요소 수준을 추가합니다.이 수치 수준은 선택한 "NA 수준"이 추가 된 요소 벡터로 다시 변환됩니다.


질문에 이미 답변되어 있지만이 방법을 사용하면 일부 사람들에게 더 유용 할 수 있습니다.

이 함수를 정의하십시오.

na.zero <- function (x) {
    x[is.na(x)] <- 0
    return(x)
}

이제 벡터의 NA를 0으로 변환해야 할 때마다 다음을 할 수 있습니다.

na.zero(some.vector)

행렬 또는 벡터에서 replace() 를 사용하여 NA0 으로 대체하는보다 일반적인 방법

예 :

> x <- c(1,2,NA,NA,1,1)
> x1 <- replace(x,is.na(x),0)
> x1
[1] 1 2 0 0 1 1

이것은 dplyr 에서 ifelse() 를 사용하는 대신에 사용할 수도 있습니다.

df = data.frame(col = c(1,2,NA,NA,1,1))
df <- df %>%
   mutate(col = replace(col,is.na(col),0))

Datacamp 에서 추출한이 간단한 함수는 다음과 같이 도움이 될 수 있습니다.

replace_missings <- function(x, replacement) {
  is_miss <- is.na(x)
  x[is_miss] <- replacement

  message(sum(is_miss), " missings replaced by the value ", replacement)
  x
}

그때

replace_missings(df, replacement = 0)

replace() 사용할 수 있습니다.

예 :

> x <- c(-1,0,1,0,NA,0,1,1)
> x1 <- replace(x,5,1)
> x1
[1] -1  0  1  0  1  0  1  1

> x1 <- replace(x,5,mean(x,na.rm=T))
> x1
[1] -1.00  0.00  1.00  0.00  0.29  0.00 1.00  1.00

imputeTS 패키지를 사용하는 또 다른 예 :

library(imputeTS)
na.replace(yourDataframe, 0)




na