Я пытаюсь перебрать список фреймов данных, удаляя столбцы, которые не соответствуют некоторым условиям. Я хочу изменить фреймы данных так, чтобы они по существу пропустили 1 столбец. После выполнения функции я могу изменить СПИСОК фреймов данных, но не самих исходных фреймов данных.
df1 <- data.frame(
a = c("John","Peter","Dylan"),
b = c(1, 2, 3),
c = c("yipee", "ki", "yay"))
df2 <- data.frame(
a = c("Ray","Bob","Derek"),
b = c(4, 5, 6),
c = c("yum", "yummy", "donuts"))
df3 <- data.frame(
a = c("Bill","Sam","Nate"),
b = c(7, 8, 9),
c = c("I", "eat", "cake"))
l <- list(df1, df2, df3)
drop_col <- function(x) {
x <- x[, !names(x) %in% c("e", "b", "f")]
return(x)
}
l <- lapply(l, drop_col)
Когда я вызываю список l, я получаю список фреймов данных с нужными мне изменениями. Когда я вызываю элемент в списке, df1, df2 или df3, у них нет отброшенного столбца.
Я рассмотрел это решение и многие другие, я явно чего-то не хватает.
3 ответа
l
список и df1
, df2
и т. Д. Кадры данных являются независимыми. Они не имеют ничего общего друг с другом. Один из способов получения новых измененных фреймов данных - это присвоение имен списку и создание нового фрейма данных.
l <- lapply(l, drop_col)
names(l) <- paste0("df", 1:3)
list2env(l, .GlobalEnv)
Проблема в том, что когда вы создаете l
, вы заполняете его копиями своих фреймов данных df1
, df2
, df3
. В R, как правило, невозможно передавать ссылки на переменные. Один из обходных путей - создать среду, как это делает @Ronak Shah.
Другой способ - использовать get()
и <<-
для изменения переменной внутри функции.
drop_cols <- function(x) {
for(iter in x)
do.call("<<-", list(iter, drop_col(get(iter))))
}
drop_cols(c("df1","df2","df3"))
df1 <- data.frame(
a = c("John","Peter","Dylan"),
b = c(1, 2, 3),
c = c("yipee", "ki", "yay"))
df2 <- data.frame(
a = c("Ray","Bob","Derek"),
b = c(4, 5, 6),
c = c("yum", "yummy", "donuts"))
df3 <- data.frame(
a = c("Bill","Sam","Nate"),
b = c(7, 8, 9),
c = c("I", "eat", "cake"))
# Name the list elements:
l <- list(df1 = df1, df2 = df2, df3 = df3)
drop_col <- function(x) {
x <- x[, !names(x) %in% c("e", "b", "f")]
return(x)
}
l <- lapply(l, drop_col)
# View altered dfs:
View(l["df1"])
Похожие вопросы
Связанные вопросы
Новые вопросы
r
R - это бесплатный язык программирования с открытым исходным кодом и программная среда для статистических вычислений, биоинформатики, визуализации и общих вычислений. Пожалуйста, предоставьте минимальные и воспроизводимые примеры вместе с желаемым результатом. Используйте dput () для данных и укажите все небазовые пакеты с вызовами library (). Не вставляйте изображения для данных или кода, вместо этого используйте блоки кода с отступом. По вопросам, связанным со статистикой, используйте https://stats.stackexchange.com.