2010-05-04 7 views
13

próbuję zastąpić elementy data.frame zawierające "# N/A" z "null", i używam do problemu:R: Jak zastąpić elementy pliku data.frame?

foo <- data.frame("day"= c(1, 3, 5, 7), "od" = c(0.1, "#N/A", 0.4, 0.8)) 

indices_of_NAs <- which(foo == "#N/A") 

replace(foo, indices_of_NAs, "NULL") 

Błąd w [<-.data.frame (*tmp*, listy wartości = „null”): po istniejących kolumn nowe kolumny byłoby zostawić otwory

Myślę, że problemem jest to, że mój indeks jest traktowanie data.frame jako wektor, ale że zastąpienie funkcji jest traktowanie go jakoś inaczej, ale Nie jestem pewien, co to jest problem?

Odpowiedz

19

NULL naprawdę oznacza "nic", a nie "brakujące", więc nie może zastąpić rzeczywistej wartości - w przypadku braku R używa NA.

Możesz użyć metody zamiennej is.na, aby bezpośrednio zaktualizować wybrane elementy, to zadziała z logicznym wynikiem. (Używanie których dla indeksów będzie działać tylko z is.na, bezpośrednie użycie [wywołuje dostęp do listy, co jest przyczyną twojego błędu).

foo <- data.frame("day"= c(1, 3, 5, 7), "od" = c(0.1, "#N/A", 0.4, 0.8)) 
NAs <- foo == "#N/A" 

## by replace method 
is.na(foo)[NAs] <- TRUE 

## or directly 
foo[NAs] <- NA 

Ale jesteś już do czynienia z ciągów (w rzeczywistości czynnikiem domyślnie) w kolumnie: od wymuszoną przymusu, kiedy został utworzony z (c), i może trzeba traktować indywidualnie kolumn. Dowolna kolumna numeryczna nigdy nie będzie pasowała do napisu "# N/A", na przykład.

+0

Nigdy nie zdawałem sobie sprawy, że istnieje "is.na <-", zbyt fajne. – geoffjentry

+0

Co masz na myśli przez "Dowolna kolumna liczbowa nigdy nie będzie pasowała do ciągu" # N/D ", na przykład."? Jak mogę sprawdzić, jakiego rodzaju kolumny patrzę? – spier

+0

Ładne rozwiązanie. Jak sprawić, by kolumny zostały ponownie zinterpretowane jako numeryczne po zamianie wartości na NA? Mam tuziny kolumn i zbyt trudno jest określić, które z nich miały zmienione wartości NA. – Dave

1

Funkcja zamiany oczekuje wektora i dostarczasz element data.frame.

Powinieneś naprawdę spróbować użyć wartości NA i NULL zamiast wartości, które aktualnie używasz. W przeciwnym razie nie będziesz w stanie wykorzystać wszystkich funkcji R do obsługi brakujących wartości.

Edit

można użyć funkcji zastosowania, lub zrobić coś takiego:

foo <- data.frame(day= c(1, 3, 5, 7), od = c(0.1, NA, 0.4, 0.8)) 
idx <- which(is.na(foo), arr.ind=TRUE) 
foo[idx[1], idx[2]] <- "NULL" 

Nie można przypisać prawdziwe NULL wartość w tym przypadku, ponieważ ma zerową długość. Ważne jest, aby zrozumieć różnicę między NA i NULL, dlatego zalecam przeczytanie ?NA i ?NULL.

+0

Dziękuję Shane, czy polecisz konwertować moje dane.frame na wektor, wykonać funkcję, a następnie przekonwertować z powrotem do data.frame? Będę używał sugerowanych formatów danych. – John

12

Dlaczego nie

x$col[is.na(x$col)]<-value 

?
Nie będziesz musiał zmienić swojej ramówki danych