按 r 中的列中的值对列表进行子集化

Subsetting list by values in a column in r

我想对数据框列表进行子集化,以便它 returns 具有相同结构的列表,但不包括每个数据框中满足一列条件的行。

假设我有以下列表:

col1<- round(rnorm(5, mean = 5), digits = 0)
col2<- round(rnorm(5, mean = 5), digits = 0)
col3<- round(rnorm(5, mean = 5), digits = 0)
a <- data.frame(col1, col2, col3)

col1<- round(rnorm(5, mean = 5), digits = 0)
col2<- round(rnorm(5, mean = 5), digits = 0)
col3<- round(rnorm(5, mean = 5), digits = 0)
b <- data.frame(col1, col2, col3)

col1<- round(rnorm(5, mean = 5), digits = 0)
col2<- round(rnorm(5, mean = 5), digits = 0)
col3<- round(rnorm(5, mean = 5), digits = 0)
c <- data.frame(col1, col2, col3)

my_list <- list(a,b,c)
names(my_list)<-c("df1", "df2", "df3")

这提供了一个列表:

> my_list
$df1
  col1 col2 col3
1    3    6    5
2    5    4    4
3    6    5    6
4    5    3    6
5    4    4    4

$df2
  col1 col2 col3
1    6    5    5
2    6    5    5
3    5    6    6
4    5    4    5
5    6    5    5

$df3
  col1 col2 col3
1    6    7    5
2    6    5    5
3    5    6    4
4    4    6    5
5    5    6    4 

假设我想删除 col3 中值小于 5 的所有行,生成:

> my_list
$df1
  col1 col2 col3
1    3    6    5
3    6    5    6
4    5    3    6


$df2
  col1 col2 col3
1    6    5    5
2    6    5    5
3    5    6    6
4    5    4    5
5    6    5    5

$df3
  col1 col2 col3
1    6    7    5
2    6    5    5
4    4    6    5

我尝试使用 lapply 无济于事:

result <- lapply(my_list, function(x) {
  return(x[x$'col3' < 5])
}
)

> result 
$df1
[1] FALSE  TRUE FALSE FALSE  TRUE

$df2
[1] FALSE FALSE FALSE FALSE FALSE

$df3
[1] FALSE FALSE  TRUE FALSE  TRUE

如有任何帮助,我们将不胜感激!

这是一个 tidyverse 解决方案:

library(tidyverse)

result <- function(x) {
  x %>% 
    filter(col3 < 6)
}

map(my_list, result)

这 returns listdata.frame,其中 col3 小于 6。

$df1
  col1 col2 col3
1    5    4    4
2    4    4    4

$df2
  col1 col2 col3
1    6    7    5

$df3
  col1 col2 col3
1    6    5    5
2    5    5    5
3    5    5    3

您可以使用 map_df:

组合成一个 data.frame
map_df(my_list, result)

这给了我们:

> map_df(my_list, result)
  col1 col2 col3
1    5    4    4
2    4    4    4
3    6    7    5
4    6    5    5
5    5    5    5
6    5    5    3

基础

set.seed(1)
l <- lapply(my_list, function(x) subset(x, col3 >= 5))
l
#> $df1
#>   col1 col2 col3
#> 1    5    5    5
#> 2    5    5    5
#> 3    4    4    5
#> 
#> $df2
#>   col1 col2 col3
#> 1    6    5    7
#> 2    3    6    5
#> 4    5    5    5
#> 
#> $df3
#>   col1 col2 col3
#> 4    4    5    7
#> 5    7    4    7

do.call(rbind, l)
#>       col1 col2 col3
#> df1.1    5    5    5
#> df1.2    5    5    5
#> df1.3    4    4    5
#> df2.1    6    5    7
#> df2.2    3    6    5
#> df2.4    5    5    5
#> df3.4    4    5    7
#> df3.5    7    4    7

reprex package (v1.0.0)

于 2021-02-05 创建