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

Я хотел бы преобразовать значения NA в столбце факторов нескольких кадров данных в строку «неизвестно». Этот столбец имеет одно и то же имя столбца в нескольких кадрах данных, хранящихся в списке. У меня есть список из двух фреймов данных, каждый из которых содержит столбец фактора с тем же именем:

a = c(1,2,3,4)
b = factor(c("Yes","No",NA,"No"))
df1 <- data.frame(a,b)
b = factor(c("Yes",NA,"No","Yes"))
df2 <- data.frame(a,b)
df_i <- list(df1,df2)

Я могу сделать это преобразование в каждом кадре данных самостоятельно:

df1$b = factor(df1$b, levels=c(levels(df1$b),"unknown"))
df1$b[which(is.na(df1$b))] <- "unknown"

Однако я хотел бы сделать это для всех фреймов данных в списке с оговоркой, что я хочу явно использовать имя столбца (b), а не индекс столбца, так как расположение соответствующего столбца не всегда будет в том же индексном слоте. Я пытался использовать lapply и ddply, но не получил желаемых результатов:

df_i <- lapply(df_i, ddply, .(b), factor, levels=c(levels(.(b)),"unknown"))

Это заканчивается заменой значений каждого кадра данных:

>df_i
[[1]]
  a  b
1 NA NA
2 NA NA
3 NA NA

[[2]]
  a  b
1 NA NA
2 NA NA
3 NA NA

Не знаете, куда идти дальше - есть ли совет, как заставить это работать на всех фреймах данных в списке?


person aero_nautica    schedule 30.09.2016    source источник
comment
Вы ищете функцию addNA. Расширение для выполнения этого в списке должно быть довольно ясным. Кстати, ddply из пакета plyr, а не из dplyr. Оба пакета принадлежат одному и тому же человеку, который просто пытается нас запутать.   -  person Frank    schedule 30.09.2016
comment
Спасибо! Я новичок в r и все еще пытаюсь освоить структуру apply. Не могли бы вы пояснить, как применять addNA к определенным столбцам в списке фреймов данных?   -  person aero_nautica    schedule 30.09.2016
comment
Конечно, поскольку вы перезаписываете df_i, можно изменить его в цикле вместо использования lapply: for (i in seq_along(df_i)){ new_b = addNA(df_i[[i]]$b); levels(new_b) <- c(levels(df_i[[i]]$b), "unknown"); df_i[[i]]$b = new_b } Вместо этого точки с запятой могут быть новыми строками. Я скопирую его в чат R, чтобы его было легче читать chat.stackoverflow.com/rooms/25312/r -public К сожалению, вам нужно 20 повторений, чтобы прокомментировать в чате.   -  person Frank    schedule 30.09.2016