Подтвердить что ты не робот

Заменить все конкретные значения в кадре данных

Имея кадр данных, как мне пойти на замену всех конкретных значений по всем строкам и столбцам. Скажем, например, я хочу заменить все пустые записи на NA (без ввода позиций):

df <- data.frame(list(A=c("", "xyz", "jkl"), B=c(12, "", 100)))

    A   B
1      12
2  xyz    
3  jkl 100

Ожидаемый результат:

    A   B
1  NA   12
2  xyz  NA  
3  jkl  100
4b9b3361

Ответ 1

Вот так:

> df[df==""]<-NA
> df
     A    B
1 <NA>   12
2  xyz <NA>
3  jkl  100

Ответ 2

Поскольку PikkuKatja и glallen попросили более общее решение, и я еще не могу прокомментировать, я напишу ответ. Вы можете комбинировать утверждения, как в:

> df[df=="" | df==12] <- NA
> df
     A    B
1  <NA> <NA>
2  xyz  <NA>
3  jkl  100

Для факторов код zxzak уже дает факторы:

> 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

Если в беде я предлагаю временно отказаться от факторов.

df[] <- lapply(df, as.character)

Ответ 3

Мы можем использовать data.table, чтобы быстро ее получить. Сначала создайте df без факторов,

df <- data.frame(list(A=c("","xyz","jkl"), B=c(12,"",100)), stringsAsFactors=F)

Теперь вы можете использовать

setDT(df)
for (jj in 1:ncol(df)) set(df, i = which(df[[jj]]==""), j = jj, v = NA)

и вы можете преобразовать его обратно в файл data.frame

setDF(df)

Если вы хотите использовать data.frame и удержать факторы, это сложнее, вам нужно работать с

levels(df$value)[levels(df$value)==""] <- NA

где значение - это имя каждого столбца. Вам нужно вставить его в цикл.

Ответ 4

Если вы хотите заменить несколько значений в фрейме данных, может понадобиться цикл через все столбцы.

Предположим, вы хотите заменить "" и 100:

na_codes <- c(100, "")
for (i in seq_along(df)) {
    df[[i]][df[[i]] %in% na_codes] <- NA
}