2012-09-07 35 views
5

tôi có nhiều cột số nguyên trong một khung dữ liệu, tất cả bằng NA mà tôi cần phải mã hóa lại để 0.Recode NA trong nhiều cột dataframe

df1 <- as.data.frame(sapply(paste(sample(letters,50,T),sample(letters,10), sep=""), function(x) {sample(c(NA,0:5),10,T)})) 
df2 <- as.data.frame(sapply(paste(sample(letters,5,T),sample(letters,10,T), sep=""), function(x) {sample(letters[1:5],10,T)})) 
df <- cbind(df2,df1) 

Sản xuất một sản lượng như thế này ... (chỉ có vài đầu tiên cột của 55 thể hiện)

enter image description here

tôi có thể đi về recoding NAS 0 bằng tay như df$col[is.na(df$col)] <- 0 cho mỗi cột, nhưng cho rằng có rất nhiều cột, nó sẽ mất một thời gian để gõ rằng tất cả ra .

Làm cách nào để tôi có thể mã hóa tất cả các NA này thành 0 trong một dòng hoặc ba?

(Tôi nhận ra tôi có thể làm tan chảy các cột số nguyên và sau đó mã hóa lại một cột tan chảy, nhưng tôi thà làm điều này trong cơ sở R)

Trả lời

11

Bạn đã tiến rất gần:

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

Woah .... không thể tin rằng nó là dễ dàng. Làm thế nào tôi có thể sau đó xác định một loạt các cột để recode, thay vì tất cả chúng? –

+1

Nevermind, tôi hiểu rồi. 'df [6:10] [is.na (df [6:10])] <- 0'. Tôi thậm chí không nghĩ thêm hai dấu ngoặc vuông trong một hàng. –

+0

@ TommyO'Dell, Không sao cả. Như tôi đã nói, bạn đã rất thân thiết! – A5C1D2H2I1M1N2O1R2T1

2

Sử dụng plyr 's colwise meta-chức năng làm cho điều này dễ dàng:

dfZ=colwise(function(x)ifelse(is.na(x),0,x))(df) 
+1

mặc dù phương pháp @ mrdwab chắc chắn ngắn hơn để nhập. –

Các vấn đề liên quan