【问题标题】:How to filter data by date in a dataframe-list in R?如何在 R 中的数据框列表中按日期过滤数据?
【发布时间】:2018-06-24 04:43:13
【问题描述】:

我有大量数据框。它看起来像下面的那个,只是更大。

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 年之后的所有年份。我知道如何在数据框中执行此操作,但是如何添加数据框列表中的所有 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, ]}

它不起作用,有谁知道错误可能在哪里?有人知道更简单的解决方案吗?

【问题讨论】:

  • 您能否提供使用dput 的示例,以便我们能够轻松地复制它?另外,请提供您遇到的错误。
  • 它是如何工作的?我做了 dput (dataframe_list),但这对我提供数据有何帮助?哦,我没有例子,我只是在这里做的。我只有巨大的数据框列表。
  • 我现在在上面的帖子中有一个例子!

标签: r list dataframe filter


【解决方案1】:

您可以将库 purrr 中的 map 与过滤器一起使用:

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

或者在基础 R 中:

lapply(df_list,function(x) subset(x,speed==7))

【讨论】:

  • 谢谢,但我有日期,如何转换它们?
  • 你应该提供可重现的数据,我不擅长盲编码,但也许map(df_list, ~mutate(.x,V1 = as.Date(V1)) %&gt;% filter(lubridate::year(V1) &gt;= 1995, lubridate::year(V1) &lt;= 2000)
  • 1995 和 2000 是年份(数值),而不是日期
  • 好的,等一下,我提供一个例子!但和上面的不一样。
  • 这个例子现在在我原来的帖子上面!
【解决方案2】:

您忘记在 i 上选择您的数据框:

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

您还需要使用year 选择一年中的年份部分。

更好的执行方式:使用 data.table 框架

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, ]
}

使用 data.table 框架应该可以通过大 data.frames 让您的计算速度更快。

另一个带有 lapply 的版本:

相同的代码但更易于阅读。为data.frame定义过滤函数:

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)

【讨论】:

    猜你喜欢
    • 2014-02-28
    • 2019-11-27
    • 2016-08-03
    • 2018-06-17
    • 2018-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-02
    相关资源
    最近更新 更多