Я хотел бы преобразовать значения 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
Не знаете, куда идти дальше - есть ли совет, как заставить это работать на всех фреймах данных в списке?
addNA
. Расширение для выполнения этого в списке должно быть довольно ясным. Кстати, ddply из пакета plyr, а не из dplyr. Оба пакета принадлежат одному и тому же человеку, который просто пытается нас запутать. - person Frank   schedule 30.09.2016apply
. Не могли бы вы пояснить, как применятьaddNA
к определенным столбцам в списке фреймов данных? - person aero_nautica   schedule 30.09.2016df_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