Я пытаюсь перебрать список фреймов данных, удаляя столбцы, которые не соответствуют некоторым условиям. Я хочу изменить фреймы данных так, чтобы они по существу пропустили 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, у них нет отброшенного столбца.

Я рассмотрел это решение и многие другие, я явно чего-то не хватает.

0
potato 10 Фев 2020 в 09:46

3 ответа

Лучший ответ

l список и df1, df2 и т. Д. Кадры данных являются независимыми. Они не имеют ничего общего друг с другом. Один из способов получения новых измененных фреймов данных - это присвоение имен списку и создание нового фрейма данных.

l <- lapply(l, drop_col)
names(l) <- paste0("df", 1:3)
list2env(l, .GlobalEnv)
2
Ronak Shah 10 Фев 2020 в 07:01

Проблема в том, что когда вы создаете 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"))
2
nigelhenry 10 Фев 2020 в 07:48
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"])
0
hello_friend 10 Фев 2020 в 07:39