Zamień wszystkie wartości 0 Na NA

Mam ramkę danych z kilkoma kolumnami numerycznymi. Niektóre wiersze mają wartość 0, która powinna być traktowana jako null w analizie statystycznej. Jaki jest najszybszy sposób na zastąpienie wszystkich wartości 0 Na NULL W R?

 93
r
Author: Ben Bolker, 2012-06-14

7 answers

Zamiana wszystkich zer na NA:

df[df == 0] <- NA



Wyjaśnienie

1. to nie jest NULL to, co powinieneś zastąpić zerami. Jak napisano w ?'NULL',

NULL reprezentuje obiekt null W R

Który jest unikalny I, jak sądzę, może być postrzegany jako najbardziej niedoinformowany i pusty obiekt.1 wtedy nie staje się tak zaskakujące, że

data.frame(x = c(1, NULL, 2))
#   x
# 1 1
# 2 2

Czyli R nie rezerwuje miejsca na ten obiekt null.2 tymczasem patrząc na ?'NA' widzimy, że

NA jest logiczną stałą długości 1, która zawiera brakującą wartość wskaźnik. NA może być wymuszony do dowolnego innego typu wektorowego z wyjątkiem raw.

Ważne, NA Jest długości 1 tak, że R rezerwuje dla niej trochę miejsca. Np.,

data.frame(x = c(1, NA, 2))
#    x
# 1  1
# 2 NA
# 3  2

Również struktura ramki danych wymaga, aby wszystkie kolumny miały taką samą liczbę elementów, aby nie było "dziur" (tj. NULL wartości).

Teraz Można zastąpić zera przez NULL w ramce danych w sensie całkowitego usunięcia wszystkich wierszy zawierających co najmniej jedno zero. Podczas używania np., var, cov, lub cor, co w rzeczywistości jest równoznaczne z zastąpieniem zera przez NA i ustawieniem wartości use jako "complete.obs". Zazwyczaj jest to jednak niezadowalające, ponieważ prowadzi do dodatkowej utraty informacji.

2. zamiast uruchamiać jakąś pętlę, w rozwiązaniu używam df == 0 wektoryzacji. df == 0 zwraca (spróbuj) macierz tej samej wielkości co df, z wpisami TRUE i FALSE. Ponadto możemy również przekazać tę macierz do podzbioru [...] (patrz ?'['). Wreszcie, podczas gdy wynik df[df == 0] jest doskonale intuicyjny, może wydawać się dziwne, że df[df == 0] <- NA daje pożądany efekt. Operator przypisania <- nie zawsze jest tak inteligentny i nie działa w ten sposób z niektórymi innymi obiektami, ale robi to z ramkami danych; zobacz ?'<-'.


1 pusty zbiór w teorii mnogości wydaje się w jakiś sposób powiązany.
2 Inne podobieństwo do teorii mnogości: zbiór pusty jest podzbiorem każdego zbioru, ale nie zastrzegamy dla niego żadnej przestrzeni.

 172
Author: Julius Vainora,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-08-19 20:43:49

Pozwól mi założyć, że Twoje dane.ramka jest mieszanką różnych typów danych i nie wszystkie kolumny muszą być modyfikowane.

Aby zmodyfikować tylko kolumny od 12 do 18 (z wszystkich 21), po prostu zrób to

df[, 12:18][df[, 12:18] == 0] <- NA
 23
Author: userJT,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-02-20 14:08:32

Alternatywny sposób bez funkcji [<-:

Przykładowa ramka danych dat (bezwstydnie skopiowana z odpowiedzi @ Chase):

dat

  x y
1 0 2
2 1 2
3 1 1
4 2 1
5 0 0

Zera można zastąpić NA przez funkcję is.na<-:

is.na(dat) <- !dat


dat

   x  y
1 NA  2
2  1  2
3  1  1
4  2  1
5 NA NA
 22
Author: Sven Hohenstein,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-08-24 20:16:04
#Sample data
set.seed(1)
dat <- data.frame(x = sample(0:2, 5, TRUE), y = sample(0:2, 5, TRUE))
#-----
  x y
1 0 2
2 1 2
3 1 1
4 2 1
5 0 0

#replace zeros with NA
dat[dat==0] <- NA
#-----
   x  y
1 NA  2
2  1  2
3  1  1
4  2  1
5 NA NA
 14
Author: Chase,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-06-14 16:11:26

Ponieważ ktoś poprosił o dane.Tabelkowa wersja tego, a ponieważ podane dane.rozwiązanie frame nie działa z danymi.tabela, poniżej przedstawiam rozwiązanie.

Zasadniczo użyj operatora :=--> DT[x == 0, x := NA]

library("data.table")

status = as.data.table(occupationalStatus)

head(status, 10)
    origin destination  N
 1:      1           1 50
 2:      2           1 16
 3:      3           1 12
 4:      4           1 11
 5:      5           1  2
 6:      6           1 12
 7:      7           1  0
 8:      8           1  0
 9:      1           2 19
10:      2           2 40


status[N == 0, N := NA]

head(status, 10)
    origin destination  N
 1:      1           1 50
 2:      2           1 16
 3:      3           1 12
 4:      4           1 11
 5:      5           1  2
 6:      6           1 12
 7:      7           1 NA
 8:      8           1 NA
 9:      1           2 19
10:      2           2 40
 11
Author: Reilstein,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-06-02 00:58:09

dplyr::na_if() jest opcją:

library(dplyr)  

df <- data_frame(col1 = c(1, 2, 3, 0),
                 col2 = c(0, 2, 3, 4),
                 col3 = c(1, 0, 3, 0),
                 col4 = c('a', 'b', 'c', 'd'))

na_if(df, 0)
# A tibble: 4 x 4
   col1  col2  col3 col4 
  <dbl> <dbl> <dbl> <chr>
1     1    NA     1 a    
2     2     2    NA b    
3     3     3     3 c    
4    NA     4    NA d
 6
Author: sbha,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-07-04 16:59:32

Możesz zastąpić 0 przez NA tylko w polach liczbowych( tzn. z wyłączeniem czynników), ale działa to na zasadzie kolumna po kolumnie:

col[col == 0 & is.numeric(col)] <- NA

Za pomocą funkcji możesz zastosować to do całej ramki danych:

changetoNA <- function(colnum,df) {
    col <- df[,colnum]
    if (is.numeric(col)) {  #edit: verifying column is numeric
        col[col == -1 & is.numeric(col)] <- NA
    }
    return(col)
}
df <- data.frame(sapply(1:5, changetoNA, df))

Chociaż możesz zastąpić 1:5 liczbą kolumn w ramce danych, lub 1:ncol(df).

 4
Author: Alium Britt,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-02-20 20:28:06