【发布时间】:2021-04-30 12:18:30
【问题描述】:
我想对数据框列表进行子集化,以便它以相同的结构返回列表,但不包括每个数据框中满足一列条件的行。
假设我有以下列表:
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
任何帮助将不胜感激!
【问题讨论】:
-
缺少逗号?
return(x[x$'col3' < 5, ])(使用$时也不需要在“col3”周围加上引号 -
感谢您指出引号和逗号。更改此设置似乎无法解决问题,但遵循 Yuriy 的以下建议效果很好。
-
不知道为什么它不应该工作 - 对我来说非常适合。由于缺少 set.seed(),您的示例不是很可重复 - 这可能是原因吗?显然,您需要更改为
x[x$col3 >= 5, ]- 你这样做了吗? -
我很抱歉。你是对的,这行得通。