根据每个数据框的名称过滤命名列表中的数据框

时间:2019-04-19 15:33:59

标签: r filter lapply

我在一个命名列表中有多个数据框,下面是可重现的示例:

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 个答案:

答案 0 :(得分:2)

遍历数据框名称

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 :(得分:1)

使用tidyverse,我们可以使用list遍历imap并使用.y,即list的名称用于filter ing < / p>

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

答案 2 :(得分:1)

我们可以使用base R的{​​{1}}和Map

subset