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


답변:


879

@ gsk3 answer에서 내 의견을 참조하십시오. 간단한 예 :

> 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패키지를 살펴 봐야 합니다. 누락 된 데이터 분석에 유용한 기능이 많이 있습니다. =)


2
어제 코드를 게시하기 전에 어제 시도했지만 작동하지 않았습니다. 이 때문에 질문을 게시했습니다. 그러나 나는 알고 노력하고 완벽하게 일했습니다. 내가 잘못하고 있다고 생각합니다.
Renato Dinhani

12
@ RenatoDinhaniConceição : 이미 시도한 것이 있으면 질문 할 때 해당 정보를 공유하는 것이 좋습니다. 문제가있는 곳을 좁히는 데 도움이됩니다.
아론은 스택 오버플로를 왼쪽

2
d [is.na (d)] <-0은 이해가되지 않습니다. 거꾸로 보인다? R은이 진술을 어떻게 처리합니까?
user798719

13
@ user798719- "<-"는 R의 할당 연산자이며 다음과 같이 읽을 수 있습니다. 오른쪽에서 무언가를 수행 한 다음 왼쪽의 위치 / 이름에 할당하십시오. 이 경우, 우리는 실제로 아무것도하지 않고 단지 제로를 만드는 것입니다. 왼쪽은 말합니다 : d 객체를보고, d 객체 (대괄호) 내부에서 TRUE를 반환하는 모든 요소를 ​​찾으십시오 (is.na (d)는 각 요소에 대한 논리를 반환합니다). 일단 발견되면 값을 0으로 바꾸십시오 ( "할당"). 이것은 비 NA를 모두 그대로 남겨두고 누락 된 것으로 만 바꿉니다.
Twitch_City

3
그리고 ... 데이터 프레임이 있고 특정 nurmeric 벡터에만 대체를 적용하려는 경우 (예 : NA가 포함 된 문자열) :df[19:28][is.na(df[19:28])] <- 0
jtdoud

299

dplyr 하이브리드 옵션은 Base R 서브 세트 재 할당보다 약 30 % 빠릅니다. 100M 데이터 포인트에서 데이터 프레임 mutate_all(~replace(., is.na(.), 0))은 기본 R d[is.na(d)] <- 0옵션 보다 0.5 초 빠르게 실행됩니다 . 구체적으로 피하고 싶은 것은 ifelse()또는을 사용하는 것 if_else()입니다. (이러한 접근 방식을 포함하여 600 건의 전체 시험 분석이 4.5 시간 이상 진행되었습니다.) 전체 결과는 아래의 벤치 마크 분석을 참조하십시오.

방대한 데이터 프레임으로 어려움을 겪고 있다면 data.table표준 Base R 방식 보다 40 % 더 빠릅니다 . 또한 데이터를 제자리에 수정하여 거의 두 배의 데이터를 한 번에 처리 할 수 ​​있습니다.


다른 유용한 tidyverse 대체 접근법의 클러스터링

위치 :

  • 인덱스 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))

완전한 분석-

dplyr 0.8.0으로 업데이트 : 함수는 purrr 형식 ~기호를 사용 funs()합니다. 더 이상 사용되지 않는 인수를 대체 합니다.

테스트 된 접근법 :

# 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(
    hybrid.ifelse    = hybrid.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 '의이 replace_na역사적 앞에 꺼내었다. 현재 100M 개의 데이터 포인트가 수집되므로 Base R For Loop 와 거의 동일하게 수행 됩니다. 다른 크기의 데이터 프레임에서 어떤 일이 발생하는지 궁금합니다.

mutatesummarize _at_all기능 변형에 대한 추가 예제는 여기 ( https://rdrr.io/cran/dplyr/man/summarise_all.html) 에서 찾을 수 있습니다. 또한 https : //blog.exploratory 에서 유용한 데모 및 예제 모음을 발견했습니다 . io / dplyr-0-5- 굉장히 여기-왜 -be095fd4eb8a

기여와 감사

특별한 덕분에 :

  • 마이크로 벤치 마크를 보여준 Tyler RinkerAkrun .
  • alexis_laz 님이 저의 사용을 이해하도록 도와 주셔서 감사합니다 local()(프랭크의 환자의 도움으로). 이러한 강요의 대부분을 가속화하는 데 침묵 강요가하는 역할도 있습니다.
  • poke가 새로운 coalesce()기능 을 추가 하고 분석을 업데이트 하기위한 ArthurYip
  • 그 너 저는 그 라인 저에 data.table기능을 포함시키기에 충분히 기능 을 알아낼 수 있도록 그레고르 (Gregor) .
  • 기본 R For 루프 : alexis_laz
  • data.table For 루프 : Matt_Dowle
  • is.numeric()실제로 테스트 하는 것을 설명하는 로마자 .

(물론, 그러한 접근 방식이 유용하다고 생각되면, 그들에게 다가 가서 투표를하십시오.)

숫자 사용에 대한 참고 사항 : 순수한 정수 데이터 세트가 있으면 모든 함수가 더 빨리 실행됩니다. 자세한 내용은 alexiz_laz의 작업 을 참조하십시오. IRL, 10-15 % 이상의 정수가 포함 된 데이터 세트가 발생하는 것을 기억할 수 없으므로 완전 숫자 데이터 프레임에서 이러한 테스트를 실행하고 있습니다.

24GB RAM의 3.9GHz CPU 사용 하드웨어


2
@Frank-불일치를 찾아 주셔서 감사합니다. 참조가 모두 정리되고 결과가 단일 시스템에서 완전히 다시 실행되어 다시 게시되었습니다.
leerssej

알았어 고마워. 또한, 나는 df1[j][is.na(df1[j])] = 0틀렸다고 생각 한다df1[[j]][is.na(df1[[j]])] = 0
Frank

이제 벤치 마크마다 다르게 두 번 작성한 것을 알 수 있습니다. 어쨌든, forLp_Sbst누군가가 그것에 접근하는 것을 고려해야하는 방법처럼 보이지 않습니다forLp_smplfSbst
Frank

1
@ UweBlock-좋은 질문 : 정확히 동일한 데이터 프레임에서 작동하는 모든 기능으로 하위 설정 왼쪽 할당 작업을 수행 할 수있었습니다. 그 기능을 둘러싼 지역을 감싸 야했기 때문에 과학의 이름으로 [한 직업, 당신은 한 직업을 가졌습니다!] 나는 경기장이 분명한 수준이되도록 그것들을 모두 감쌌습니다. 자세한 내용은 다음을 참조하십시오. stackoverflow.com/questions/41604711/… 이전에 답이 다소 줄어들었지만 토론의 일부를 다시 추가하는 것이 좋습니다. 감사합니다!
leerssej

1
@ArthurYip- coalesce()옵션을 추가 하고 항상 다시 실행했습니다. 너지 업데이트에 감사드립니다.
leerssej

128

단일 벡터의 경우 :

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

data.frame의 경우 위의 함수를 만든 다음 apply열에 적용하십시오.

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

훌륭한 R 재현 가능한 예를 만드는 방법?


18
is.na일반 함수이며 data.frame클래스의 객체에 대한 메소드가 있습니다 . 그래서 이것도 data.frames에서 작동합니다 !
aL3xa

3
methods(is.na)처음 뛰었 을 때 나는 whaaa?!? . 그런 일이 일어날 때 나는 사랑 해요! =)
aL3xa

9
단일 벡터 대신 df라는 데이터 프레임이 있고 X3이라는 단일 열에서 누락 된 관측치를 바꾸려고한다고 가정합니다. df $ X3 [is.na (df $ X3)] <-0
Mark Miller

8
my.df라는 데이터 프레임의 열 4-6에서 NA를 0으로 바꾸려고한다고 가정하십시오. 다음을 사용할 수 있습니다 : my.df [, 4 : 6] [is.na (my.df [, 4 : 6])] <-0
Mark Miller

어떻게 'x'를 is.na (x)에 전달합니까? R에서 어떤 라이브러리 루틴이 벡터화되는지 알 수있는 방법이 있습니까?
uh_big_mike_boi

73

dplyr 예 :

library(dplyr)

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

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


57

NAcsv에 쓸 때와 같이 내보낼 때 s 를 바꾸려고 하면 다음을 사용할 수 있습니다.

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

47

나는 질문에 이미 답변되어 있지만이 방법을 사용하면 더 유용 할 수 있습니다.

이 기능을 정의하십시오 :

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

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

na.zero(some.vector)

22

함께 dplyr0.5.0, 당신은 사용할 수 있습니다 coalesce쉽게 통합 될 수있는 기능을 %>%수행하여 파이프 라인을 coalesce(vec, 0). 그러면 모든 NA vec가 0으로 바뀝니다 .

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

나는 합체를 테스트했으며 교체와 거의 동일하게 수행합니다. 통합 명령은 지금까지 가장 간단합니다!
Arthur Yip

2+ 열 티블의 모든 열에 적용하는 방법을 제시하는 경우 유용합니다.
jangorecki

21

replace()대체 NA할 행렬 또는 벡터를 사용하는보다 일반적인 접근 방식0

예를 들면 다음과 같습니다.

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

이것은 또한 ifelse()in 을 사용하는 대안 입니다.dplyr

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

1
내 열은 한 가지 요인으로 교체 값을 추가해야했습니다.levels(A$x) <- append(levels(A$x), "notAnswered") A$x <- replace(A$x,which(is.na(A$x)),"notAnswered")
Climbs_lika_Spyder

1
which필요하지 않습니다 x1 <- replace(x,is.na(x),1). 을 사용할 수 있습니다 .
lmo

나는 대체하기 위해이 스레드에서 제안 된 많은 방법을 시도 NA0큰 데이터 프레임에 하나의 특정 컬럼에이 기능을 replace()가장 효율적으로 또한 동안 가장 간단했다.
Duc

19

을 사용하는 것도 가능합니다 tidyr::replace_na.

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

9

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

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

9

요인 변수에서 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 레벨"을 하나 더 사용하여 팩터 벡터로 다시 변환합니다.


8

@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/ ~.참고 문헌, 즉 데이터 프레임 "모든 것을 우리가 함께 노력하고 있습니다." 이제 0이 있습니다!


4

당신이 사용할 수있는 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

6
사실이지만 NA벡터에서 의 인덱스를 알고있는 경우에만 실용적 입니다. 귀하의 예와 같이 작은 벡터에는 좋습니다.
dardisco

4
@dardisco x1 <- replace(x,is.na(x),1)는 인덱스 값을 명시 적으로 나열하지 않고 작동합니다.
lmo

4

여러 열에서 작동 dplyr하는 tidyr방법 replace_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)

4

해당 목적을위한 전용 기능 ( nafill/ setnafill)은 최신 data.table버전입니다

install.packages("data.table", repos="https://Rdatatable.gitlab.io/data.table")
library(data.table)
ans_df = nafill(df, fill=0)
setnafill(df, fill=0) # this one updates in-place

downvoting하는 사람들을 위해, 피드백을 제공하십시오. 그래서 나의 대답은 향상 될 수 있습니다.
jangorecki

3

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)

3

를 작성하는 쉬운 방법은 함께 if_na에서 hablar:

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

2

데이터 프레임에서 모든 NA를 바꾸려면 다음을 사용할 수 있습니다.

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


이것은 새로운 해결책이 아닙니다
jogo

1

이 경우 V3 열의 특정 열에서 NA를 변경 한 후 새 이름을 지정하려면 다음과 같이하십시오.

my.data.frame$the.new.column.name <- ifelse(is.na(my.data.frame$V3),0,1)
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.