使用相同的条件但更少的代码行在R中子集多个数据帧

使用相同的条件但更少的代码行在R中子集多个数据帧,r,subset,data-cleaning,R,Subset,Data Cleaning,我有几个数据帧具有相同的列,但按年份划分。我希望使用相同的条件删除数据帧中的行,但希望减少这样做所需的代码行数 df1 lat long ID 44 10 1 43 20 2 42 30 3 45 39 4 df2 lat long ID 47 10 1 44 20 2 46 30 3 43 39 4 例如,我只想保留lat大于或等于44且小于或等于45的观测值,以

我有几个数据帧具有相同的列,但按年份划分。我希望使用相同的条件删除数据帧中的行,但希望减少这样做所需的代码行数

df1
lat   long   ID
44    10     1
43    20     2
42    30     3
45    39     4

df2
lat   long   ID
47    10     1
44    20     2
46    30     3
43    39     4
例如,我只想保留lat大于或等于44且小于或等于45的观测值,以及大于或等于10且小于或等于30的长度(实际上不是我正在处理的数据,但你明白了)


我希望避免大量的代码行(对于这些示例帧2,几行代码似乎不多,但我有10个不同的数据帧,每个数据帧都有数百万个观察值,我希望将它们分开)。我知道循环在R中通常很慢,所以有效地使用同一个函数对多个数据帧进行子集划分而不将它们组合在一起的最佳方法是什么。

您可以将数据帧放在列表中,然后使用
lappy
对它们进行子集划分

list_data <- list(df1, df2)
result <- lapply(list_data, subset, lat >= 44 & lat <= 45 & long >= 10 & long <= 30)

您可以将数据帧放在一个列表中,并使用
lappy
将其子集

list_data <- list(df1, df2)
result <- lapply(list_data, subset, lat >= 44 & lat <= 45 & long >= 10 & long <= 30)

Ronak击败了我,但在
base R

将所有数据帧放入列表中

dfs <- Filter(function(x) is(x, "data.frame"), mget(ls()))

Ronak击败了我,但在
base R

将所有数据帧放入列表中

dfs <- Filter(function(x) is(x, "data.frame"), mget(ls()))

我们也可以使用
data.table

library(data.table)
list_data <- list(setDT(df1), setDT(df2))
result <- lapply(list_data, function(dt) dt[between(lat, 44, 45) & between(long, 10, 30)])
库(data.table)

列出数据我们也可以使用数据表

library(data.table)
list_data <- list(setDT(df1), setDT(df2))
result <- lapply(list_data, function(dt) dt[between(lat, 44, 45) & between(long, 10, 30)])
库(data.table)
列出数据
library(data.table)
list_data <- list(setDT(df1), setDT(df2))
result <- lapply(list_data, function(dt) dt[between(lat, 44, 45) & between(long, 10, 30)])