Memiliki kerangka data, bagaimana cara saya mengganti semua nilai tertentu di sepanjang semua baris dan kolom. Katakanlah misalnya saya ingin mengganti semua catatan kosong dengan NA
's (tanpa mengetik posisi):
df <- data.frame(list(A=c("", "xyz", "jkl"), B=c(12, "", 100)))
A B
1 12
2 xyz
3 jkl 100
Hasil yang diharapkan:
A B
1 NA 12
2 xyz NA
3 jkl 100
df[df=="xyz"]<-"abc"
akan error dengan "tingkat faktor tidak valid." Apakah ada solusi yang lebih umum?Karena PikkuKatja dan glallen meminta solusi yang lebih umum dan saya belum bisa berkomentar, saya akan menulis jawaban. Anda dapat menggabungkan pernyataan seperti di:
> df[df=="" | df==12] <- NA > df A B 1 <NA> <NA> 2 xyz <NA> 3 jkl 100
Untuk faktor, kode zxzak sudah menghasilkan faktor:
> 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
Jika dalam masalah, saya sarankan untuk sementara menghilangkan faktor-faktor tersebut.
df[] <- lapply(df, as.character)
sumber
Berikut ini beberapa
dplyr
opsi: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'))
sumber
Kita bisa menggunakan data.table untuk mendapatkannya dengan cepat. Pertama buat df tanpa faktor,
df <- data.frame(list(A=c("","xyz","jkl"), B=c(12,"",100)), stringsAsFactors=F)
Sekarang Anda bisa menggunakan
setDT(df) for (jj in 1:ncol(df)) set(df, i = which(df[[jj]]==""), j = jj, v = NA)
dan Anda dapat mengubahnya kembali menjadi data.frame
Jika Anda hanya ingin menggunakan data.frame dan mempertahankan faktor itu lebih sulit, Anda perlu bekerja dengannya
levels(df$value)[levels(df$value)==""] <- NA
dimana nilai adalah nama setiap kolom. Anda perlu memasukkannya dalam satu lingkaran.
sumber
Jika Anda ingin mengganti beberapa nilai dalam bingkai data, perulangan melalui semua kolom mungkin membantu.
Katakanlah Anda ingin mengganti
""
dan100
:na_codes <- c(100, "") for (i in seq_along(df)) { df[[i]][df[[i]] %in% na_codes] <- NA }
sumber