首页 > 解决方案 > 在另一个变量的值在该日期达到最大值/最小值的日期之后使用拆分数据框

问题描述

我有一个类似于以下的数据集:

df <- data.frame( 
                date = c("2020-02-01", "2020-02-02", "2020-02-03", "2020-02-04", "2020-02-05", "2020-02-06"),
               value = c(0,1,2,7,3,4))

我想将我的数据框拆分为两个较小的数据框,以便第一个数据框在值达到最大值(即 7)之前包含原始数据框的一部分,而数据框的第二部分包括其余的原始数据框如下:

df1 <- data.frame(
                 date = c("2020-02-01", "2020-02-02", "2020-02-03"),
                 value = c(0,1,2)
                 )
df2 <- data.frame(
                 date = c("2020-02-04", "2020-02-05", "2020-02-06"),
                 value = c(7, 3, 4)
                 )

*** 问题的第二部分现在假设我有以下数据集,其中包括多个由 ID 标识的对象。所以,我想和上面解释的一样,并应用于所有对象(ID)

df <- data.frame( ID = c(1,1,1,1,1,1,2,2,2,2),
                date = c("2020-02-01", "2020-02-02", "2020-02-03", "2020-02-04", "2020-02-05", "2020-02-06", "2020-02-01", "2020-02-02","2020-02-03", "2020-02-04"),
               value = c(0,1,2,7,3,4,10,16,11,12))

谢谢你的时间。

标签: rdataframedatetimesplit

解决方案


您可以使用which.max获取max值索引并将其用于数据帧的子集。

ind <- which.max(df$value)
df1 <- df[seq_len(ind - 1), ]
df2 <- df[ind:nrow(df), ]

df1
# A tibble: 3 x 2
#  date       value
#  <chr>      <dbl>
#1 2020-02-01     0
#2 2020-02-02     1
#3 2020-02-03     2

df2
# A tibble: 3 x 2
#  date       value
#  <chr>      <dbl>
#1 2020-02-04     7
#2 2020-02-05     3
#3 2020-02-06     4

如果有很多ID's,我们可以创建一个数据框列表,我们必须为每个 's 执行此操作ID

result <- df %>%
            group_split(ID) %>%
            purrr::map(~{.x %>% 
               group_split(row_number() < which.max(value), .keep = FALSE)})

## In case, someone is interested you could make a data frame from the list above as follows: 
result_df <- result %>%
bind_rows()



推荐阅读