codememo

R 데이터 프레임에서 NA 값을 0으로 바꾸려면 어떻게 해야 합니까?

tipmemo 2023. 6. 12. 21:31
반응형

R 데이터 프레임에서 NA 값을 0으로 바꾸려면 어떻게 해야 합니까?

있고 에는 데터프있일열부은이 있습니다.NA가치.

교체방을 대체하려면 해야 합니까?NA0이 있는 값?

@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분석을 .누락된 데이터 분석에 적합한 기능이 많이 있습니다.=)

R 집합재할당보다 약더.dplyr 하이드옵션이제은 R 위재다보약당할집 30% ▁the다니릅%▁ared▁than빠▁now▁the▁dized▁around▁reassign▁subset더▁optionsply▁30▁r%▁hybrid약rs▁30▁baserply▁faster다이브.100M 데이터 포인트 데이터 프레임에서mutate_all(~replace(., is.na(.), 0)) R보다 0. 빠르게 됩니다.d[is.na(d)] <- 0선택.특히 피하고 싶은 것은 사용하는 것입니다.ifelse() 는또.if_else()은 주로 접근법을 에 4전체 결과는 아래의 벤치마크 분석을 참조하십시오.

대규모 데이터 프레임으로 인해 어려움을 겪고 있다면,data.table가장 빠른 옵션입니다. 표준 Base R 접근 방식보다 40% 더 빠릅니다.또한 데이터를 수정하여 거의 두 배의 데이터를 한 번에 처리할 수 있습니다.


다른 유용한 깔끔한 대체 접근 방식의 클러스터링

위치:

  • 색인을 달다 mutate_at(c(5:10), ~replace(., is.na(.), 0))
  • 직접 언급 mutate_at(vars(var5:var10), ~replace(., is.na(.), 0))
  • 고정 매치 mutate_at(vars(contains("1")), ~replace(., is.na(.), 0))
  • 는또대에신 에.contains(), 시도ends_with(),starts_with()
  • 패턴 매치 mutate_at(vars(matches("\\d{2}")), ~replace(., is.na(.), 0))

조건부:
(단일 유형만 변경하고 다른 유형은 그대로 둡니다.)

  • 정수 mutate_if(is.integer, ~replace(., is.na(.), 0))
  • 숫자들 mutate_if(is.numeric, ~replace(., is.na(.), 0))
  • 줄들 mutate_if(is.character, ~replace(., is.na(.), 0))

##The Complete Analysis - Update for dplyr 0.8.0: 함수는 purr 형식 기호, 즉 사용되지 않는 인수 대체를 사용합니다.

###테스트된 접근 방식:

# Base R: 
baseR.sbst.rssgn   <- function(x) { x[is.na(x)] <- 0; x }
baseR.replace      <- function(x) { replace(x, is.na(x), 0) }
baseR.for          <- function(x) { for(j in 1:ncol(x))
    x[[j]][is.na(x[[j]])] = 0 }

# tidyverse
## dplyr
dplyr_if_else      <- function(x) { mutate_all(x, ~if_else(is.na(.), 0, .)) }
dplyr_coalesce     <- function(x) { mutate_all(x, ~coalesce(., 0)) }

## tidyr
tidyr_replace_na   <- function(x) { replace_na(x, as.list(setNames(rep(0, 10), as.list(c(paste0("var", 1:10)))))) }

## hybrid 
hybrd.ifelse     <- function(x) { mutate_all(x, ~ifelse(is.na(.), 0, .)) }
hybrd.replace_na <- function(x) { mutate_all(x, ~replace_na(., 0)) }
hybrd.replace    <- function(x) { mutate_all(x, ~replace(., is.na(.), 0)) }
hybrd.rplc_at.idx<- function(x) { mutate_at(x, c(1:10), ~replace(., is.na(.), 0)) }
hybrd.rplc_at.nse<- function(x) { mutate_at(x, vars(var1:var10), ~replace(., is.na(.), 0)) }
hybrd.rplc_at.stw<- function(x) { mutate_at(x, vars(starts_with("var")), ~replace(., is.na(.), 0)) }
hybrd.rplc_at.ctn<- function(x) { mutate_at(x, vars(contains("var")), ~replace(., is.na(.), 0)) }
hybrd.rplc_at.mtc<- function(x) { mutate_at(x, vars(matches("\\d+")), ~replace(., is.na(.), 0)) }
hybrd.rplc_if    <- function(x) { mutate_if(x, is.numeric, ~replace(., is.na(.), 0)) }

# data.table   
library(data.table)
DT.for.set.nms   <- function(x) { for (j in names(x))
    set(x,which(is.na(x[[j]])),j,0) }
DT.for.set.sqln  <- function(x) { for (j in seq_len(ncol(x)))
    set(x,which(is.na(x[[j]])),j,0) }
DT.nafill        <- function(x) { nafill(df, fill=0)}
DT.setnafill     <- function(x) { setnafill(df, fill=0)}

###이 분석의 코드:

library(microbenchmark)
# 20% NA filled dataframe of 10 Million rows and 10 columns
set.seed(42) # to recreate the exact dataframe
dfN <- as.data.frame(matrix(sample(c(NA, as.numeric(1:4)), 1e7*10, replace = TRUE),
                            dimnames = list(NULL, paste0("var", 1:10)), 
                            ncol = 10))
# Running 600 trials with each replacement method 
# (the functions are excecuted locally - so that the original dataframe remains unmodified in all cases)
perf_results <- microbenchmark(
    hybrd.ifelse     = hybrd.ifelse(copy(dfN)),
    dplyr_if_else    = dplyr_if_else(copy(dfN)),
    hybrd.replace_na = hybrd.replace_na(copy(dfN)),
    baseR.sbst.rssgn = baseR.sbst.rssgn(copy(dfN)),
    baseR.replace    = baseR.replace(copy(dfN)),
    dplyr_coalesce   = dplyr_coalesce(copy(dfN)),
    tidyr_replace_na = tidyr_replace_na(copy(dfN)),
    hybrd.replace    = hybrd.replace(copy(dfN)),
    hybrd.rplc_at.ctn= hybrd.rplc_at.ctn(copy(dfN)),
    hybrd.rplc_at.nse= hybrd.rplc_at.nse(copy(dfN)),
    baseR.for        = baseR.for(copy(dfN)),
    hybrd.rplc_at.idx= hybrd.rplc_at.idx(copy(dfN)),
    DT.for.set.nms   = DT.for.set.nms(copy(dfN)),
    DT.for.set.sqln  = DT.for.set.sqln(copy(dfN)),
    times = 600L
)

###결과 요약

> print(perf_results)
Unit: milliseconds
              expr       min        lq     mean   median       uq      max neval
      hybrd.ifelse 6171.0439 6339.7046 6425.221 6407.397 6496.992 7052.851   600
     dplyr_if_else 3737.4954 3877.0983 3953.857 3946.024 4023.301 4539.428   600
  hybrd.replace_na 1497.8653 1706.1119 1748.464 1745.282 1789.804 2127.166   600
  baseR.sbst.rssgn 1480.5098 1686.1581 1730.006 1728.477 1772.951 2010.215   600
     baseR.replace 1457.4016 1681.5583 1725.481 1722.069 1766.916 2089.627   600
    dplyr_coalesce 1227.6150 1483.3520 1524.245 1519.454 1561.488 1996.859   600
  tidyr_replace_na 1248.3292 1473.1707 1521.889 1520.108 1570.382 1995.768   600
     hybrd.replace  913.1865 1197.3133 1233.336 1238.747 1276.141 1438.646   600
 hybrd.rplc_at.ctn  916.9339 1192.9885 1224.733 1227.628 1268.644 1466.085   600
 hybrd.rplc_at.nse  919.0270 1191.0541 1228.749 1228.635 1275.103 2882.040   600
         baseR.for  869.3169 1180.8311 1216.958 1224.407 1264.737 1459.726   600
 hybrd.rplc_at.idx  839.8915 1189.7465 1223.326 1228.329 1266.375 1565.794   600
    DT.for.set.nms  761.6086  915.8166 1015.457 1001.772 1106.315 1363.044   600
   DT.for.set.sqln  787.3535  918.8733 1017.812 1002.042 1122.474 1321.860   600

###결과 상자 그림

ggplot(perf_results, aes(x=expr, y=time/10^9)) +
    geom_boxplot() +
    xlab('Expression') +
    ylab('Elapsed Time (Seconds)') +
    scale_y_continuous(breaks = seq(0,7,1)) +
    coord_flip()

상자 그림 경과 시간 비교

시행의 색상 코드 산점도(로그 척도에 y축 표시)

qplot(y=time/10^9, data=perf_results, colour=expr) + 
    labs(y = "log10 Scaled Elapsed Time per Trial (secs)", x = "Trial Number") +
    coord_cartesian(ylim = c(0.75, 7.5)) +
    scale_y_log10(breaks=c(0.75, 0.875, 1, 1.25, 1.5, 1.75, seq(2, 7.5)))

모든 시행 시간의 산점도

다른 고성능 제품에 대한 참고 사항

데이터 세트가 커지면 Tidyr's는replace_na역사적으로 앞으로 철수했습니다.현재 실행해야 하는 100M개의 데이터 포인트 컬렉션에서는 루프에 대한 기본 R만큼 정확하게 수행됩니다.다양한 크기의 데이터 프레임에서 어떤 일이 발생하는지 궁금합니다.

에대 예가제에 대한 mutate그리고.summarize _at그리고._all함수 변형은 다음에서 확인할 수 있습니다: https://rdrr.io/cran/dplyr/man/summarise_all.html 추가로 유용한 데모와 예제 모음을 찾았습니다. https://blog.exploratory.io/dplyr-0-5-is-awesome-heres-why-be095fd4eb8a

귀인 및 감사

특별한 감사를 표합니다.

  • Tyler Lincer와 Akrun은 마이크로 벤치마크를 시연했습니다.
  • 사용법을 이해하는 데 도움을 준 alexis_messagelocal()그리고 (프랭크의 인내심 있는 도움으로) 침묵의 강요가 이러한 접근법의 많은 속도를 높이는 역할을 합니다.
  • 아서 엽은 새로운 것을 추가하기 위해 포케를 했습니다.coalesce()기능을 수행하고 분석을 업데이트합니다.
  • 그레고르는 그것을 알아내려고 노력했습니다.data.table최종적으로 라인업에 포함시킬 수 있을 정도로 기능이 뛰어납니다.
  • 루프에 대한 기본 R: 알렉시스_레슬링
  • data.loops용 테이블: 맷 돌
  • 이 무슨 말인지 요.is.numeric()진짜 시험.

(물론, 그러한 접근법이 유용하다고 생각되는 경우에도 연락하여 투표를 포기하십시오.)

숫자 사용에 대한 참고:순수 정수 데이터 집합이 있으면 모든 기능이 더 빠르게 실행됩니다.자세한 내용은 alexiz_laz의 작업을 참조하십시오.IRL, 정수가 10-15%를 초과하는 데이터 집합을 본 기억이 없어서 완전한 숫자 데이터 프레임에 대해 이러한 테스트를 실행하고 있습니다.

사용된 하드웨어 3.9GHz CPU(24GB RAM)

단일 벡터의 경우:

x <- c(1,2,NA,4,5)
x[is.na(x)] <- 0

data.frame 경우의, 위함를만들고,apply그것을 열까지.

다음 번에는 여기에 자세히 설명된 대로 재현 가능한 예를 제공하십시오.

R 재현 가능한 훌륭한 예제를 만드는 방법은 무엇입니까?

dplyr 예제:

library(dplyr)

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

참고: 이는 선택한 열당 작동합니다. 모든 열에 대해 이 작업을 수행해야 할 경우 mutate_each를 사용한 @reidjax의 답변을 참조하십시오.

가 하려경우는체를 대체하려고 .NA를 내보낼 를 들어 csv에 쓸는 다음과같이 할 수 있습니다. s 내 보 낼 에 를 csv 쓸 사 을 용 할 있 수 니 습 다 다 음 때 예 때 를 어 들 ▁s : 다

  write.csv(data, "data.csv", na = "0")

또한사수있다니습할용다를 사용하는 것도 합니다.tidyr::replace_na.

    library(tidyr)
    df <- df %>% mutate_all(funs(replace_na(.,0)))

편집(dplyr > 1.0.0):

df %>% mutate(across(everything(), .fns = ~replace_na(.,0))) 

질문에 이미 답했다는 것은 알고 있지만, 이러한 방식으로 하는 것이 일부에게는 더 유용할 수 있습니다.

이 기능을 정의합니다.

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

이것은 또한 사용에 대한 대안입니다.ifelse()dplyr

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

와 함께dplyr0.5.0을 사용할 수 있습니다.coalesce에게통합수쉽에 될 수 있는 %>%을 하여 파이프라인을 .coalesce(vec, 0)은 의모를 NA 다니대에 있는 를 대체합니다.vec0과 함께:

예를어데프에임레가 있는 데이터 이 있다고 .NAs:

library(dplyr)
df <- data.frame(v = c(1, 2, 3, NA, 5, 6, 8))

df
#    v
# 1  1
# 2  2
# 3  3
# 4 NA
# 5  5
# 6  6
# 7  8

df %>% mutate(v = coalesce(v, 0))
#   v
# 1 1
# 2 2
# 3 3
# 4 0
# 5 5
# 6 6
# 7 8

데이터 프레임의 모든 NA를 교체하려면 다음을 사용할 수 있습니다.

df %>% replace(is.na(.), 0)

@ianmunoz의 게시물에 댓글을 달았을 텐데, 저는 충분한 평판이 없습니다.할합수있다니습결다를 조합할 수 .dplyrmutate_each그리고.replace처하기위해를 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

를하고 있기 기에서표평에가를준여는합그니다때어야문에밑을줄기사용하에."▁"core여▁we합▁unders다▁on니▁the▁eval)se▁we▁(uation▁which▁standard)"에 밑줄이 필요합니다.funs_사용하기도 합니다.lazyevalinterp/~ 리고그고.."우리가 작업하는 모든 것", 즉 데이터 프레임을 참조합니다.이제 0이 있습니다!

귀책자를 사용한 다른 예TS 패키지:

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

기능, 전용기능,,nafill그리고.setnafill은 그런목으로에 .data.table사용 가능할 때마다 여러 스레드에서 계산할 열을 배포합니다.

library(data.table)

ans_df <- nafill(df, fill=0)

# or even faster, in-place
setnafill(df, fill=0)

요인 변수의 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-수준"이 하나 더 있는 요인-벡터로 다시 변환됩니다.

dplyr >= 1.0.0

의 신버전에서dplyr:

cross ()는 summary_at(),summary_if(), 및 summary_all().와 같은 "범위가 있는 변형" 군을 대체합니다.

df <- data.frame(a = c(LETTERS[1:3], NA), b = c(NA, 1:3))

library(tidyverse)

df %>% 
  mutate(across(where(anyNA), ~ replace_na(., 0)))

  a b
1 A 0
2 B 1
3 C 2
4 0 3

이 코드는 강제로 적용됩니다.0첫 번째 열에 있는 문자입니다.대할내용을 NA열 유형을 기준으로 Purr과 같은 공식을 사용할 수 있습니다.where:

df %>% 
  mutate(across(where(~ anyNA(.) & is.character(.)), ~ replace_na(., "0")))

라이브러리를 사용할 필요가 없습니다.

df <- data.frame(a=c(1,3,5,NA))

df$a[is.na(df$a)] <- 0

df

사용할 수 있습니다.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

cleaner에 패지가있다가 있습니다.na_replace()일반적으로, 기본적으로 숫자 값을 0으로 대체하고 논리는FALSE오늘 날짜 등:

library(dplyr)
library(cleaner)

starwars %>% na_replace()
na_replace(starwars)

벡터화된 대체 기능도 지원합니다.

mtcars[1:6, c("mpg", "hp")] <- NA
na_replace(mtcars, mpg, hp, replacement = c(999, 123))

설명서: https://msberends.github.io/cleaner/reference/na_replace.html

하나의 른다.dplyr - 파프 옵션 환이호tidyrreplace_na여러 열에 대해 작동합니다.

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)

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)

을 쓰는 쉬운 은 쓰기쉬방다같다습니과음은법운다와 함께 쓰는 것입니다.if_nahablar:

library(dplyr)
library(hablar)

df <- tibble(a = c(1, 2, 3, NA, 5, 6, 8))

df %>% 
  mutate(a = if_na(a, 0))

다음을 반환합니다.

      a
  <dbl>
1     1
2     2
3     3
4     0
5     5
6     6
7     8

데이터 프레임에서 is.na 및 NULL을 바꿉니다.

  1. 열이 있는 데이터 프레임

A$name[is.na (A$name)]<-0

OR

A$name[is.na (A$name)]<-"NA"

  1. 모든 데이터 프레임 사용

df[is.na (df)]<-0

  1. 데이터 프레임에 공백이 있는 replace na를 사용합니다.

df[is.na (df)]<-""

  1. NULL을 NA로 대체

df[is.null(df)] <- NA

이 경우 열 V3의 특정 열에서 NA를 변경한 후 새 이름을 할당하려면 다음과 같이 할 수 있습니다.

my.data.frame$the.new.column.name <- ifelse(is.na(my.data.frame$V3),0,1)

저는 인기 있는 패키지를 사용하는 다음 솔루션을 추가하고 싶습니다.

library(Hmisc)
data(airquality)
# imputing with 0 - all columns
# although my favorite one for simple imputations is Hmisc::impute(x, "random")
> dd <- data.frame(Map(function(x) Hmisc::impute(x, 0), airquality))
> str(dd[[1]])
 'impute' Named num [1:153] 41 36 12 18 0 28 23 19 8 0 ...
 - attr(*, "names")= chr [1:153] "1" "2" "3" "4" ...
 - attr(*, "imputed")= int [1:37] 5 10 25 26 27 32 33 34 35 36 ...
> dd[[1]][1:10]
  1   2   3   4   5   6   7   8   9  10 
 41  36  12  18  0*  28  23  19   8  0* 

모든 귀속 메타데이터가 속성으로 할당되는 것을 알 수 있었습니다.따라서 나중에 사용할 수 있습니다.

이것이 정확히 새로운 해결책은 아니지만, 저는 패키지로 처리할 수 없는 것들을 처리하는 인라인 람다를 쓰는 것을 좋아합니다.이 경우에는,

df %>%
   (function(x) { x[is.na(x)] <- 0; return(x) })

볼 수 에, 이 솔루션은 변수 R은 Python을 .df대부분의 다른 솔루션과 동일한 작업을 수행할 수 있지만 특정 패키지에 대한 복잡한 지식이 훨씬 덜 필요합니다.

함수 정의 주변의 괄호를 확인합니다!되는 것 , brace로 둘러싸여 있기 내에서 .magrittr.

이것은 더 유연한 솔루션입니다.은 데터프레크상작니관.0은다같표다니됩시이로 됩니다.0또는zero또는 그 무엇이든.

library(dplyr) # make sure dplyr ver is >= 1.00

df %>%
    mutate(across(everything(), na_if, 0)) # if 0 is indicated by `zero` then replace `0` with `zero`

을 사용하는 다른 sapply 것을 NA한 코드입니다.다음은 재현 가능한 코드(@aL3xa의 데이터)입니다.

set.seed(7) # for reproducibility
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   9  7  5  5  7  7  4  6  6   7
#> 2   2  5 10  7  8  9  8  8  1   8
#> 3   6  7  4 10  4  9  6  8 NA  10
#> 4   1 10  3  7  5  7  7  7 NA   8
#> 5   9  9 10 NA  7 10  1  5 NA   5
#> 6   5  2  5 10  8  1  1  5 10   3
#> 7   7  3  9  3  1  6  7  3  1  10
#> 8   7  7  6  8  4  4  5 NA  8   7
#> 9   2  1  1  2  7  5  9 10  9   3
#> 10  7  5  3  4  9  2  7  6 NA   5
d[sapply(d, \(x) is.na(x))] <- 0
d
#>    V1 V2 V3 V4 V5 V6 V7 V8 V9 V10
#> 1   9  7  5  5  7  7  4  6  6   7
#> 2   2  5 10  7  8  9  8  8  1   8
#> 3   6  7  4 10  4  9  6  8  0  10
#> 4   1 10  3  7  5  7  7  7  0   8
#> 5   9  9 10  0  7 10  1  5  0   5
#> 6   5  2  5 10  8  1  1  5 10   3
#> 7   7  3  9  3  1  6  7  3  1  10
#> 8   7  7  6  8  4  4  5  0  8   7
#> 9   2  1  1  2  7  5  9 10  9   3
#> 10  7  5  3  4  9  2  7  6  0   5

reprex v2.0.2를 사용하여 2023-01-15에 생성됨


참고:R 4.1.0 이후 사용 가능합니다.\(x)function(x).

은 다옵션다같다니습과음은을 사용하는 것입니다.collapse::replace_NA기적으로본,replace_NANA를 0으로 대체합니다.

library(collapse)
replace_NA(df)

일부 열에 대해서만:

replace_NA(df, cols = c("V1", "V5")) 
#Alternatively, one can use a function, indices or a logical vector to select the columns

또한 다른 답변보다 빠릅니다(비교는 다음 답변 참조).

set.seed(42) # to recreate the exact dataframe
dfN <- as.data.frame(matrix(sample(c(NA, as.numeric(1:4)), 1e7*10, replace = TRUE),
                            dimnames = list(NULL, paste0("var", 1:10)), 
                            ncol = 10))

microbenchmark(collapse = replace_NA(dfN))

# Unit: milliseconds
#      expr      min      lq     mean  median       uq     max neval
#  collapse 508.9198 621.405 751.3413 714.835 859.5437 1298.69   100

data.frame에서는 돌연변이를 통해 새 열을 생성할 필요가 없습니다.

library(tidyverse)    
k <- c(1,2,80,NA,NA,51)
j <- c(NA,NA,3,31,12,NA)
        
df <- data.frame(k,j)%>%
   replace_na(list(j=0))#convert only column j, for example
    

결과

k   j
1   0           
2   0           
80  3           
NA  31          
NA  12          
51  0   

나는 이것을 개인적으로 사용했고 잘 작동합니다.

players_wd$APPROVED_WD[is.na(players_wd$APPROVED_WD)] <- 0

언급URL : https://stackoverflow.com/questions/8161836/how-do-i-replace-na-values-with-zeros-in-an-r-dataframe

반응형