如何在R中按数据帧列表中的日期筛选数据?

如何在R中按数据帧列表中的日期筛选数据?,r,list,dataframe,filter,R,List,Dataframe,Filter,我有一个很大的数据帧列表。它看起来像下面的那个,只是大了很多 V1 = c("1996-04-01", "1992-01-01", "1997-02-01", "1991-01-08", "1998-09-07") V2 = runif(5, 10.0, 100.0) V3 = runif(5, 10.0, 100.0) V4 = runif(5, 10.0, 100.0) V5 = runif(5, 10.0, 100.0) df1 = data.frame (V1, V2, V3, V4,

我有一个很大的数据帧列表。它看起来像下面的那个,只是大了很多

V1 = c("1996-04-01", "1992-01-01", "1997-02-01", "1991-01-08", "1998-09-07")
V2 = runif(5, 10.0, 100.0)
V3 = runif(5, 10.0, 100.0)
V4 = runif(5, 10.0, 100.0)
V5 = runif(5, 10.0, 100.0)

df1 = data.frame (V1, V2, V3, V4, V5) 

V1 = c("2009-04-01", "1996-01-01", "1991-02-01", "1997-01-08", "2005-09-07")
V2 = runif(5, 10.0, 100.0)
V3 = runif(5, 10.0, 100.0)
V4 = runif(5, 10.0, 100.0)
V5 = runif(5, 10.0, 100.0)

df2 = data.frame (V1, V2, V3, V4, V5) 

V1 = c("2002-04-01", "1995-01-01", "1992-02-01", "1999-01-08", "2007-09-07")
V2 = runif(5, 10.0, 100.0)
V3 = runif(5, 10.0, 100.0)
V4 = runif(5, 10.0, 100.0)
V5 = runif(5, 10.0, 100.0)

df3 = data.frame (V1, V2, V3, V4, V5) 

dataframe_list = list(df1, df2, df3)
我想删除特定日期的行。例如1995年之前和2000年之后的所有年份。我知道如何在dataframe中实现这一点,但如何添加dataframe列表中的所有V1列?我如何使用as.Date函数?我试着做这件事时出错了。我的尝试是:

for(i in 1:length(dataframe_list)){
  dataframe_list[[i]][,1]= as.Date(dataframe_list[[i]][,1],format="%Y-%m-%d")
  dataframe_list[dataframe_list[["V1"]] >= 1995, ]
  dataframe_list[dataframe_list[["V1"]] <= 2000, ]}
它不起作用,有人知道错误在哪里吗?还有谁知道一个更简单的解决方案吗?

您可以使用带有过滤器的库映射:

df_list <- list(head(cars),head(cars),head(cars))

# [[1]]
# speed dist
# 1     4    2
# 2     4   10
# 3     7    4
# 4     7   22
# 5     8   16
# 6     9   10
# 
# [[2]]
# speed dist
# 1     4    2
# 2     4   10
# 3     7    4
# 4     7   22
# 5     8   16
# 6     9   10
# 
# [[3]]
# speed dist
# 1     4    2
# 2     4   10
# 3     7    4
# 4     7   22
# 5     8   16
# 6     9   10

library(purrr)
map(df_list, ~filter(.x,speed==7))

# [[1]]
# speed dist
# 1     7    4
# 2     7   22
# 
# [[2]]
# speed dist
# 1     7    4
# 2     7   22
# 
# [[3]]
# speed dist
# 1     7    4
# 2     7   22
您忘记在数据帧上选择:

for(i in 1:length(dataframe_list)){
  dataframe_list[[i]][,1]= as.Date(dataframe_list[[i]][,1],format="%Y-%m-%d")
  dataframe_list[[i]] = dataframe_list[[i]][year(dataframe_list[[i]][["V1"]]) >= 1995, ]
  dataframe_list[[i]] = dataframe_list[[i]][year(dataframe_list[[i]][["V1"]]) <= 2000, ]
}
dataframe_list
使用data.table framework可以使您的计算速度更快

使用Lappy的另一个版本:

相同的代码,但更容易阅读。为data.frame定义筛选函数:

filter <- function(df){
  setDT(df)
  df[, V1 := as.Date(V1,format="%Y-%m-%d")]
  return(df[year(V1) >= 1995 & year(V1) <= 2000, ])
}

您能否提供使用dput的示例,以便我们能够轻松地复制它?另外,请提供您得到的错误。这是如何工作的?我确实输入了dataframe_列表,但这如何帮助我提供数据呢?哦,我没有这个例子,我只是在这里编的。我只有巨大的数据帧列表。我现在在上面的帖子中有一个例子!谢谢,但我有日期,我如何转换它们呢?你应该提供可复制的数据,我不擅长盲编码,但也许mapdf_list,~mutate.x,V1=as.DateV1%>%filterlubridate::yearV1>=1995,lubridate::yearV1 1995和2000是年份数值,而不是datesOk,等等,我正在提供一个示例!但它和上面的不一样。这个例子现在在我原来的帖子上面!
require(data.table)
dataframe_list = lapply(dataframe_list, setDT) # Transform data.frame into data.table
for(i in 1:length(dataframe_list)){
  dataframe_list[[i]][, V1 := as.Date(V1,format="%Y-%m-%d")]
  dataframe_list[[i]] = dataframe_list[[i]][year(V1) >= 1995 & year(V1) <= 2000, ]
}
filter <- function(df){
  setDT(df)
  df[, V1 := as.Date(V1,format="%Y-%m-%d")]
  return(df[year(V1) >= 1995 & year(V1) <= 2000, ])
}
lapply(dataframe_list, filter)