Mając ramkę danych, jak mam zastąpić wszystkie określone wartości we wszystkich wierszach i kolumnach. Załóżmy na przykład, że chcę zastąpić wszystkie puste rekordy NA
słowami (bez wpisywania pozycji):
df <- data.frame(list(A=c("", "xyz", "jkl"), B=c(12, "", 100)))
A B
1 12
2 xyz
3 jkl 100
Spodziewany wynik:
A B
1 NA 12
2 xyz NA
3 jkl 100
df[df=="xyz"]<-"abc"
spowoduje błąd z „nieprawidłowym poziomem czynnika”. Czy istnieje bardziej ogólne rozwiązanie?Ponieważ PikkuKatja i glallen poprosili o bardziej ogólne rozwiązanie i nie mogę jeszcze komentować, napiszę odpowiedź. Możesz łączyć oświadczenia jak w:
> df[df=="" | df==12] <- NA > df A B 1 <NA> <NA> 2 xyz <NA> 3 jkl 100
W przypadku czynników kod zxzak już daje czynniki:
> df <- data.frame(list(A=c("","xyz","jkl"), B=c(12,"",100))) > str(df) 'data.frame': 3 obs. of 2 variables: $ A: Factor w/ 3 levels "","jkl","xyz": 1 3 2 $ B: Factor w/ 3 levels "","100","12": 3 1 2
Jeśli masz kłopoty, sugerowałbym tymczasowe odrzucenie czynników.
źródło
Oto kilka
dplyr
opcji:library(dplyr) # all columns: df %>% mutate_all(~na_if(., '')) # specific column types: df %>% mutate_if(is.factor, ~na_if(., '')) # specific columns: df %>% mutate_at(vars(A, B), ~na_if(., '')) # or: df %>% mutate(A = replace(A, A == '', NA)) # replace can be used if you want something other than NA: df %>% mutate(A = as.character(A)) %>% mutate(A = replace(A, A == '', 'used to be empty'))
źródło
Możemy skorzystać z data.table, aby to szybko uzyskać. Najpierw utwórz df bez współczynników,
df <- data.frame(list(A=c("","xyz","jkl"), B=c(12,"",100)), stringsAsFactors=F)
Teraz możesz użyć
setDT(df) for (jj in 1:ncol(df)) set(df, i = which(df[[jj]]==""), j = jj, v = NA)
i możesz przekonwertować go z powrotem do data.frame
Jeśli chcesz używać tylko data.frame i zachować czynniki, jest to trudniejsze, musisz popracować
levels(df$value)[levels(df$value)==""] <- NA
gdzie wartość to nazwa każdej kolumny. Musisz włożyć go w pętlę.
źródło
Jeśli chcesz zastąpić wiele wartości w ramce danych, pomocne może być przejrzenie wszystkich kolumn w pętli.
Powiedz, że chcesz wymienić
""
i100
:na_codes <- c(100, "") for (i in seq_along(df)) { df[[i]][df[[i]] %in% na_codes] <- NA }
źródło