按 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 list
个 data.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 创建
我想对数据框列表进行子集化,以便它 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 list
个 data.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 创建