我在一个命名列表中有多个数据帧,下面是可重现的例子:
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")
如何过滤第一个数据框以包含所有包含"yes“的行,以及如何过滤第二个数据框以包含包含"no”的行。
我试过了:
lapply(dataframes, function(x) filter(x, boolean==names(x))
但这并不起作用,只是给了我两个空的数据帧。不确定下一步要尝试什么。
发布于 2019-04-19 23:53:19
使用tidyverse
,我们可以使用imap
遍历list
并使用.y
,即用于filter
ing的list
的名称
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
发布于 2019-04-20 02:37:30
使用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
https://stackoverflow.com/questions/55764253
复制相似问题