【问题标题】:How do I split the dataframe based on dates in R?如何根据 R 中的日期拆分数据框?
【发布时间】:2021-10-04 05:15:24
【问题描述】:
x1<- split(df, cumsum(df$Date < 1900-01-01))

x2<- split(df, cumsum(df$Date >= 1945-01-01 & df$Date <= 1955-01-01))
x3<- split(df, cumsum(df$Date > 2000-01-01))

我正在尝试根据上述条件拆分数据框。但是,这些功能仅适用于第一个,而不适用于其他两个。

这是数据框 df 的样子

 Date       T_min T_max
   <chr>      <dbl> <dbl>
 1 1878-01-01   6.4  22.5
 2 1878-01-02   8.2  23.4
 3 1878-01-03   8.8  25  
 4 1878-01-04   8    24.5
 5 1878-01-05   7.8  22.4
 6 1878-01-06   7.9  20.8
 7 1878-01-07   7    21.5
 8 1878-01-08   7.7  21.4
 9 1878-01-09  10    18.5
10 1878-01-10   7.3  19.3 

【问题讨论】:

  • 你能显示 df 数据框吗?我不明白你为什么要在cumsum上分裂
  • 如果您创建一个小的可重现示例以及预期的输出,这将更容易提供帮助。阅读how to give a reproducible example
  • 我已经添加了数据框。

标签: r dataframe date split


【解决方案1】:

让我们来看看这个例子:

df <- data.frame(V1 = c("1800-01-01","1950-01-01","2005-01-01"))
df <- df %>% 
  mutate(V1 = as.Date(V1))

          V1
1 1800-01-01
2 1950-01-01
3 2005-01-01

代码:

library(tidyverse)
df <- df %>% 
  mutate(indic = case_when(
    V1 < "1900-01-01" ~ 1,
    V1 >= "1945-01-01" & V1 <= "1955-01-01" ~ 2,
    V1 > "2000-01-01" ~ 3,
    TRUE ~ 4
  )) 

list_of_df <- split(df, df$indic)

i = 1
MyF <- function(input){
  out <- as.data.frame(input)
  out <- out %>% select(-indic)
  nom <- paste0("dfE",i)
  assign(nom, out, envir = .GlobalEnv)
  i <<- i + 1
}

lapply(list_of_df, MyF)

这将根据您首先使用的条件(关于日期)在您的环境中创建数据框 dfE1dfE2dfE3

> dfE1
          V1
1 1800-01-01


> dfE2
          V1
2 1950-01-01


> dfE3
          V1
3 2005-01-01

【讨论】:

  • 谢谢。我试过这段代码。但我遇到了同样的问题。它适用于第一个条件,但不适用于其他两个条件。我在问题中添加了原始数据框的样子
猜你喜欢
  • 2018-02-24
  • 2013-05-27
  • 2021-08-16
  • 1970-01-01
  • 1970-01-01
  • 2016-09-28
  • 2015-12-19
  • 2016-06-24
  • 2017-05-18
相关资源
最近更新 更多