r - 在另一个变量的值在该日期达到最大值/最小值的日期之后使用拆分数据框
问题描述
我有一个类似于以下的数据集:
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))
谢谢你的时间。
解决方案
您可以使用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()
推荐阅读
- python - Python 说“TrackerMedianFlow_create()”不再是 cv2 的属性,库更新了吗?
- java - CORS:对预检请求的响应未通过访问控制检查:预检请求不允许重定向
- wordpress - 我应该在 WordPress 上为每个页面创建一个新模板吗?
- c# - C# Selenium (0.24) Firefox 新。如何按路径加载配置文件?
- hikaricp - HikariCP/Apache DBCP2 和 PgBouncer
- javascript - 如何每 3 次将一些 HTML 推送到数组以进行输出
- html - NodeJS从HTML表单传递参数
- javascript - JSON字符串化忽略不同选项卡相同浏览器中的参数
- android - React-Native 构建失败的应用程序:mergeDebugAssets
- javascript - 如何在javascript中以人性化的方式显示redis数据