Фильтрация фреймов данных в именованном списке на основе имени каждого фрейма данных - PullRequest
1 голос
/ 19 апреля 2019

У меня есть несколько фреймов данных в именованном списке, воспроизводимый пример ниже:

set.seed(1)
df1 <- data.frame(
  numbers = sample(1:10),
  boolean = sample(c("yes", "no"), 10, replace = TRUE)
)

df2 <- data.frame(
    letters = sample(LETTERS,10),
    numbers = sample(1:10),
    boolean = sample(c("yes", "no"), 10, replace = TRUE)
)
dataframes <- list(df1, df2)
names(dataframes) <- c("yes","no")

Как я могу отфильтровать первый фрейм данных, чтобы включить все строки с «да», а второй фрейм данных, чтобы включить строки, содержащие «нет».

Я пытался:

lapply(dataframes, function(x) filter(x, boolean==names(x))

Но это не сработало, просто дало мне пустые кадры данных для обоих. Не уверен, что попробовать дальше.

Ответы [ 3 ]

2 голосов
/ 19 апреля 2019

Итерация по фреймам данных именам

lapply(names(dataframes),function(x) dplyr::filter(dataframes[[x]],boolean==x))

[[1]]
  numbers boolean
  1       3     yes
  2       4     yes
  3       7     yes
  4       8     yes
  5      10     yes

[[2]]
  letters numbers boolean
  1       Y       5      no
  2       F       6      no
  3       P       4      no
  4       C       2      no
  5       Z      10      no
  6       I       8      no
  7       X       7      no
  8       V       3      no
1 голос
/ 19 апреля 2019

Используя base R Map и subset мы можем сделать

Map(function(x, y) subset(x, boolean == y), x = dataframes, y = names(dataframes))
#$yes
#  numbers boolean
#1       3     yes
#2       4     yes
#3       7     yes
#4       8     yes
#5      10     yes

#$no
#  letters numbers boolean
#1       Y       5      no
#2       F       6      no
#3       P       4      no
#4       C       2      no
#5       Z      10      no
#6       I       8      no
#7       X       7      no
#8       V       3      no
1 голос
/ 19 апреля 2019

С tidyverse, мы можем циклически проходить через list с imap и использовать .y, то есть имена list для filter ing

library(tidyverse)
imap(dataframes,  ~ .x %>% 
                        filter(boolean == .y))
#$yes
#  numbers boolean
#1       3     yes
#2       4     yes
#3       7     yes
#4       8     yes
#5      10     yes

#$no
#  letters numbers boolean
#1       Y       5      no
#2       F       6      no
#3       P       4      no
#4       C       2      no
#5       Z      10      no
#6       I       8      no
#7       X       7      no
#8       V       3      no
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...