Вернуть измененный список в R с помощью lapply (), но объекты в списке не изменились - PullRequest
0 голосов
/ 10 февраля 2020

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

2 голосов
/ 10 февраля 2020

Проблема в том, что при создании 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 голосов
/ 10 февраля 2020

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

l <- lapply(l, drop_col)
names(l) <- paste0("df", 1:3)
list2env(l, .GlobalEnv)
0 голосов
/ 10 февраля 2020
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"])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...