我在一个命名列表中有多个数据框,下面是可重现的示例:
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))
但是那没有用,只是给了我两个空的数据帧。不知道下一步该怎么做。
答案 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