2012-09-07 14 views
5

mam wiele kolumn całkowitą w ramce danych, wszystkie z NAS, który muszę przekodować 0.Recode agencjom krajowym w wielu kolumnach 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) 

Produkcja wyjście takiego ... (tylko kilka pierwszych kolumny 55 pokazany)

enter image description here

mogę iść o recoding NAS na 0 ręcznie jak df$col[is.na(df$col)] <- 0 dla każdej kolumny, ale biorąc pod uwagę, że istnieje tak wiele kolumn, zajęłoby to trochę czasu, aby wpisać, że wszystko na zewnątrz .

Jak mogę przekodować wszystkie te NA do 0 w linii lub trzech?

(zdaję sobie sprawę, mogłem stopić kolumny liczb całkowitych, a następnie przekodować ten jeden stopiony kolumnę, ale wolałbym zrobić to w podstawowej R)

Odpowiedz

11

Byliście bardzo blisko:

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

Woah .... nie mogę uwierzyć, że to takie proste. Jak mogę określić zakres kolumn do recode, zamiast wszystkich? –

+1

Nieważne, mam to. 'df [6:10] [is.na (df [6:10])] <- 0'. Nie pomyślałem nawet o dodaniu dwóch nawiasów kwadratowych z rzędu. –

+0

@ TommyO'Dell, bez problemu. Tak jak powiedziałem, byłeś bardzo blisko! – A5C1D2H2I1M1N2O1R2T1

2

Używanie colwise meta-funkcja plyr „s ułatwia to:

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

chociaż metoda @ mrdwab jest zdecydowanie krótsza do wpisania. –

Powiązane problemy