Làm cách nào để thay thế giá trị NA bằng số không trong khung dữ liệu R?


Câu trả lời:


879

Xem bình luận của tôi trong câu trả lời @ gsk3. Một ví dụ đơn giản:

> 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

Không cần phải áp dụng apply. =)

BIÊN TẬP

Bạn cũng nên xem qua normgói. Nó có rất nhiều tính năng hay để phân tích dữ liệu. =)


2
Tôi đã thử mã này ngày hôm qua trước khi bạn đăng nó và không hoạt động. Bởi vì điều này tôi đã đăng câu hỏi. Nhưng tôi đã cố gắng biết và làm việc hoàn hảo. Tôi nghĩ rằng tôi đã làm điều gì đó sai.
Renato Dinhani

12
@ RenatoDinhaniConceição: nếu bạn đã thử một cái gì đó rồi, sẽ rất hữu ích khi chia sẻ thông tin đó khi bạn đặt câu hỏi; nó giúp thu hẹp nơi vấn đề có thể xảy ra.
Aaron rời Stack Overflow

2
d [is.na (d)] <- 0 không có ý nghĩa với tôi. Có vẻ ngược? Làm thế nào để R xử lý tuyên bố này?
dùng798719

13
@ user798719 - "<-" là toán tử gán của R và có thể được đọc là: làm một cái gì đó ở phía bên tay phải và sau đó gán nó cho vị trí / tên bên trái. Trong trường hợp này, chúng tôi không thực sự "làm" bất cứ điều gì - chỉ tạo ra số không. Phía bên trái đang nói: nhìn vào đối tượng d, bên trong đối tượng d (dấu ngoặc vuông), tìm tất cả các phần tử trả về TRUE (is.na (d) trả về logic cho mỗi phần tử). Khi chúng được tìm thấy, thay thế chúng ("gán chúng") bằng giá trị 0. Những thứ này để lại tất cả các non-NA như hiện tại và chỉ thay thế những cái bị thiếu.
Twitch_City

3
Và ... nếu bạn có khung dữ liệu và chỉ muốn áp dụng thay thế cho các vectơ nuôi dưỡng cụ thể (để lại ... chuỗi có NA):df[19:28][is.na(df[19:28])] <- 0
jtdoud

299

Các tùy chọn lai ghép dplyr hiện nhanh hơn khoảng 30% so với các tập hợp con Base R được gán lại. Trên khung dữ liệu dữ liệu 100M mutate_all(~replace(., is.na(.), 0))chạy nhanh hơn nửa giây so với d[is.na(d)] <- 0tùy chọn R cơ sở . Những gì một người muốn tránh cụ thể là sử dụng một ifelse()hoặc một if_else(). (Toàn bộ 600 phân tích thử nghiệm đã chạy đến hơn 4,5 giờ chủ yếu là do bao gồm các phương pháp tiếp cận này.) Vui lòng xem các phân tích điểm chuẩn bên dưới để biết kết quả hoàn chỉnh.

Nếu bạn đang vật lộn với các datafram lớn, data.tablelà tùy chọn nhanh nhất trong tất cả: nhanh hơn 40% so với cách tiếp cận Base R tiêu chuẩn . Nó cũng sửa đổi dữ liệu tại chỗ, cho phép bạn làm việc với gần gấp đôi số lượng dữ liệu cùng một lúc.


Một nhóm các phương pháp thay thế gọn gàng hữu ích khác

Địa điểm:

  • mục lục mutate_at(c(5:10), ~replace(., is.na(.), 0))
  • tham khảo trực tiếp mutate_at(vars(var5:var10), ~replace(., is.na(.), 0))
  • trận đấu cố định mutate_at(vars(contains("1")), ~replace(., is.na(.), 0))
    • hoặc thay thế contains(), cố gắng ends_with(),starts_with()
  • khớp mẫu mutate_at(vars(matches("\\d{2}")), ~replace(., is.na(.), 0))

Có điều kiện:
(chỉ thay đổi một loại và để các loại khác một mình.)

  • số nguyên mutate_if(is.integer, ~replace(., is.na(.), 0))
  • số mutate_if(is.numeric, ~replace(., is.na(.), 0))
  • dây mutate_if(is.character, ~replace(., is.na(.), 0))

Phân tích hoàn chỉnh -

Đã cập nhật cho dplyr 0.8.0: các hàm sử dụng ~các ký hiệu định dạng purrr : thay thế các đối funs()số không dùng nữa .

Phương pháp thử nghiệm:

# 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)}

Mã cho phân tích này:

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
)

Tóm tắt kết quả

> 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

Boxplot kết quả

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()

Boxplot So sánh thời gian đã trôi qua

Scatterplot of Trials được mã hóa màu (với trục y trên thang đo log)

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)))

Scatterplot của tất cả thời gian dùng thử

Một lưu ý về những người thực hiện cao khác

Khi các bộ dữ liệu trở nên lớn hơn, lịch sử của Tidyrreplace_na đã rút ra trước mặt. Với bộ sưu tập 100M điểm dữ liệu hiện tại để chạy qua, nó thực hiện gần như chính xác cũng như Base R For Loop. Tôi tò mò muốn xem điều gì xảy ra với các datafram có kích thước khác nhau.

Ví dụ bổ sung cho mutatesummarize _at_allcác biến thể chức năng có thể được tìm thấy ở đây: https://rdrr.io/cran/dplyr/man/summarise_all.html Bên cạnh đó, tôi thấy các cuộc biểu tình hữu ích và các bộ sưu tập các ví dụ ở đây: https: //blog.exploratory. io / dplyr-0-5-is-awesome-heres-why-be095fd4eb8a

Phân bổ và đánh giá cao

Với lời cảm ơn đặc biệt đến:

  • Tyler RinkerAkrun để chứng minh microbenchmark.
  • alexis_laz vì đã giúp tôi hiểu được việc sử dụng local()và (với sự giúp đỡ của bệnh nhân Frank cũng vậy) vai trò của sự ép buộc thầm lặng trong việc đẩy nhanh nhiều cách tiếp cận này.
  • ArthurYip cho poke để thêm coalesce()chức năng mới hơn và cập nhật phân tích.
  • Gregor cho nudge để tìm ra các data.tablechức năng đủ tốt để cuối cùng đưa chúng vào đội hình.
  • Cơ sở R Đối với vòng lặp: alexis_laz
  • data.table cho các vòng lặp: Matt_Dowle
  • Roman để giải thích những gì is.numeric()thực sự kiểm tra.

(Tất nhiên, vui lòng liên hệ và cung cấp cho họ upvote nếu bạn thấy những cách tiếp cận này hữu ích.)

Lưu ý về việc sử dụng Numerics của tôi: Nếu bạn có bộ dữ liệu số nguyên thuần, tất cả các hàm của bạn sẽ chạy nhanh hơn. Vui lòng xem công việc của alexiz_laz để biết thêm thông tin. IRL, tôi không thể nhớ đã gặp phải một tập dữ liệu chứa hơn 10-15% số nguyên, vì vậy tôi đang chạy các thử nghiệm này trên các tệp dữ liệu số đầy đủ.

Phần cứng được sử dụng CPU 3,9 GHz với RAM 24 GB


2
@Frank - Cảm ơn bạn đã tìm thấy sự khác biệt đó. Các tài liệu tham khảo đều được dọn sạch và kết quả đã được chạy lại hoàn toàn trên một máy duy nhất và đăng lại.
leerssej

Được rồi cảm ơn. Ngoài ra, tôi nghĩ df1[j][is.na(df1[j])] = 0là sai, nên làdf1[[j]][is.na(df1[[j]])] = 0
Frank

Ồ bây giờ tôi thấy bạn đã viết nó hai lần, khác nhau trong mỗi điểm chuẩn. Dù sao, forLp_Sbstdường như không phải là cách mà bất cứ ai cũng nên xem xét tiếp cận nó so vớiforLp_smplfSbst
Frank

1
@UweBlock - câu hỏi tuyệt vời: nó cho phép tôi thực hiện thao tác gán lại bên trái với tất cả các chức năng hoạt động trên cùng một khung dữ liệu. Vì tôi phải bọc địa phương xung quanh chức năng đó, sau đó nhân danh khoa học [Một công việc, bạn có một công việc!] Tôi quấn nó quanh tất cả chúng để sân chơi ở mức độ ngang bằng. Để biết thêm thông tin - vui lòng xem tại đây: stackoverflow.com/questions/41604711/ Nhật Tôi đã cắt bớt câu trả lời trước đó khá dài - nhưng phần thảo luận đó sẽ rất tốt để thêm lại. Xin cảm ơn!
leerssej

1
@ArthurYip - Tôi đã thêm coalesce()tùy chọn vào và chạy lại mọi lúc. Cảm ơn bạn đã nâng niu để cập nhật.
leerssej

128

Đối với một vectơ duy nhất:

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

Đối với một data.frame, tạo một hàm ngoài, sau applyđó đến các cột.

Vui lòng cung cấp một ví dụ tái tạo lần sau như chi tiết tại đây:

Làm thế nào để tạo một ví dụ tái tạo R tuyệt vời?


18
is.nalà hàm chung và có các phương thức cho các đối tượng của data.framelớp. Vì vậy, cái này cũng sẽ làm việc trên data.frames!
aL3xa

3
Khi tôi chạy methods(is.na)lần đầu tiên, tôi giống như ai vậy?!? . Tôi yêu khi những thứ như thế xảy ra! =)
aL3xa

9
Giả sử bạn có một khung dữ liệu có tên là df thay vì một vectơ duy nhất và bạn chỉ muốn thay thế các quan sát bị thiếu trong một cột có tên X3. Bạn có thể làm như vậy với dòng này: df $ X3 [is.na (df $ X3)] <- 0
Mark Miller

8
Giả sử bạn chỉ muốn thay thế NA bằng 0 trong các cột 4-6 của khung dữ liệu có tên my.df. Bạn có thể sử dụng: my.df [, 4: 6] [is.na (my.df [, 4: 6])] <- 0
Mark Miller

Làm thế nào mà bạn vượt qua 'x' đến is.na (x) có cách nào để cho biết các thói quen thư viện trong R được vector hóa không?
uh_big_mike_boi

73

ví dụ dplyr:

library(dplyr)

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

Lưu ý: công trình này cho mỗi cột được lựa chọn, nếu chúng ta cần phải làm điều này cho tất cả các cột, xem @reidjax câu trả lời 's sử dụng mutate_each .


57

Nếu chúng ta đang cố gắng thay thế NAs khi xuất, ví dụ như khi viết vào csv, thì chúng ta có thể sử dụng:

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

47

Tôi biết câu hỏi đã được trả lời, nhưng thực hiện theo cách này có thể hữu ích hơn với một số người:

Xác định chức năng này:

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

Bây giờ bất cứ khi nào bạn cần chuyển đổi NA trong một vectơ thành 0, bạn có thể làm:

na.zero(some.vector)

22

Với dplyr0.5.0, bạn có thể sử dụng coalescechức năng có thể dễ dàng tích hợp vào %>%đường ống bằng cách thực hiện coalesce(vec, 0). Điều này thay thế tất cả các NA vecbằng 0:

Giả sử chúng ta có khung dữ liệu với 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

Tôi đã thử nghiệm kết hợp và nó thực hiện tương tự như thay thế. lệnh kết hợp là đơn giản nhất cho đến nay!
Arthur Yip

Sẽ rất hữu ích nếu bạn trình bày cách áp dụng điều đó trên tất cả các cột của hơn 2 cột.
jangorecki

21

Cách tiếp cận chung hơn về việc sử dụng replace()trong ma trận hoặc vectơ để thay thế NAcho0

Ví dụ:

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

Đây cũng là một thay thế cho việc sử dụng ifelse()trongdplyr

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

1
Cột của tôi là một yếu tố vì vậy tôi phải thêm giá trị thay thế của mìnhlevels(A$x) <- append(levels(A$x), "notAnswered") A$x <- replace(A$x,which(is.na(A$x)),"notAnswered")
Climbs_lika_Spyder

1
whichkhông cần thiết ở đây, bạn có thể sử dụng x1 <- replace(x,is.na(x),1).
lmo

Tôi đã thử nhiều cách được đề xuất trong chủ đề này để thay thế NAcho0 chỉ trong một cột cụ thể trong một khung dữ liệu lớn và chức năng này replace()làm việc một cách hiệu quả nhất trong khi cũng chỉ đơn giản nhất.
Đức

19

Nó cũng có thể sử dụng tidyr::replace_na.

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


9

Nếu bạn muốn thay thế NA trong các biến nhân tố, điều này có thể hữu ích:

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") 

Nó biến đổi một vectơ nhân tố thành một vectơ số và thêm một mức yếu tố số nhân tạo khác, sau đó được chuyển trở lại thành một vectơ nhân tố với thêm một "cấp NA" mà bạn chọn.


8

Đã nhận xét về bài đăng của @ ianmunoz nhưng tôi không có đủ danh tiếng. Bạn có thể kết hợp dplyr's mutate_eachreplaceđể chăm sóc của NAđể 0thay thế. Sử dụng khung dữ liệu từ câu trả lời của @ 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

Chúng tôi đang sử dụng đánh giá tiêu chuẩn (SE) ở đây, đó là lý do tại sao chúng tôi cần gạch dưới " funs_." Chúng tôi cũng sử dụng lazyeval's interp/ ~và các .tham chiếu "mọi thứ chúng tôi đang làm việc", tức là khung dữ liệu. Bây giờ có số không!


4

Bạn có thể dùng replace()

Ví dụ:

> 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
Đúng, nhưng chỉ thực tế khi bạn biết chỉ số của NAs trong vector của bạn. Nó tốt cho các vectơ nhỏ như trong ví dụ của bạn.
dardisco

4
@dardisco x1 <- replace(x,is.na(x),1)sẽ hoạt động mà không liệt kê rõ ràng các giá trị chỉ mục.
LMO

4

Một dplyrtùy chọn tương thích ống khác với tidyrphương thức replace_nahoạt động cho một số cột:

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)

Bạn có thể dễ dàng hạn chế ví dụ như cột số:

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

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

df <- d %>% replace_na(myList)

4

Chức năng chuyên dụng ( nafill/ setnafill) cho mục đích đó là trong data.tablephiên bản gần đây

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

Đối với những người đang từ chối, xin vui lòng cung cấp thông tin phản hồi, vì vậy câu trả lời của tôi có thể được cải thiện.
jangorecki

3

Hàm đơn giản này được trích xuất từ Datacamp có thể giúp:

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
}

Sau đó

replace_missings(df, replacement = 0)

3

Một cách dễ dàng để viết nó là if_natừ hablar:

library(dplyr)
library(hablar)

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

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

Trả về:

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

2

Để thay thế tất cả các NA trong khung dữ liệu, bạn có thể sử dụng:

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


đây không phải là một giải pháp mới
jogo

1

nếu bạn muốn gán tên mới sau khi thay đổi NA trong một cột cụ thể trong trường hợp này là cột V3, hãy sử dụng bạn cũng có thể làm như thế này

my.data.frame$the.new.column.name <- ifelse(is.na(my.data.frame$V3),0,1)
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.