Применение dplyr :: filter к списку фреймов данных - PullRequest
0 голосов
/ 09 ноября 2019

Мне нужно отфильтровать список фреймов данных, используя dplyr::filter. Это должно быть легко, но как-то не получается. Список фреймов данных dflist, основой фильтра является значение переменной id, которая должна быть включена в include_vector (отфильтруйте те строки, где id отсутствует в include_vector).

lapply(dflist, function(x){dplyr::filter(x, id %!in% include_vector)})

Функция вроде работает (проходит через dflist и сообщений об ошибках нет), но если я посмотрю на data.frames после завершения фильтрации, data.frames точно такие же. В чем может быть проблема?

Ответы [ 2 ]

2 голосов
/ 09 ноября 2019

Использование purrr и те же данные испытаний, что и Cettt (спасибо!):

purrr::map(dflist, ~ dplyr::filter(., !(id %in% include_vector)))
2 голосов
/ 09 ноября 2019

Я думаю, вы не понимаете, что делает lapply. Это не меняет оригинал data.frames, но только в списке.

Смотрите этот пример с игрушкой:

df1 <- data.frame(id = letters[1:5])
df2 <- data.frame(id = letters[4:10])

dflist <- list(df1 = df1, df2 = df2)
include_vector <- c("d", "e", "f")

new_list <- lapply(dflist, function(x) dplyr::filter(x, ! id %in% include_vector))

Теперь new_list выглядит следующим образом:

$df1
  id
1  a
2  b
3  c

$df2
  id
1  g
2  h
3  i
4  j

Но df1 и df2 не изменились. Если вы также хотите изменить df1 и df2, вы можете сделать это:

list2env(new_list, environment())

Это перезапишет df1 и df2 в вашей текущей рабочей среде.

...