r - R:按一列分组,并返回任何其他列中值大于0的第一行,然后返回该行之后的所有行
问题描述
我是 R 编程新手,希望有人可以帮助我解决以下情况:
我有图片中显示的数据框(原始数据框),我想返回按 [ID] 列分组的第一条记录,该记录在四列(A、B、C 或 D 中的任何一列中的值 >= 1 ) 以及基于 [Date] 列之后的所有记录(所需的数据框应类似于图片中显示的输出数据框)。基本上,删除所有以黄色突出显示的记录。如果您能提供 R 代码来实现这一点,我将不胜感激。
structure(list(ID = c(101L, 101L, 101L, 101L, 101L, 101L, 103L,
103L, 103L, 103L), Date = c(43338L, 43306L, 43232L, 43268L, 43183L,
43144L, 43310L, 43246L, 43264L, 43209L), A = c(0L, 0L, 0L, 0L,
0L, 0L, 0L, 1L, 0L, 0L), B = c(0L, 2L, 0L, 0L, 0L, 0L, 0L, 1L,
0L, 0L), C = c(0L, 0L, 1L, 0L, 0L, 0L, 0L, 0L, 0L, 0L), D = c(0L,
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L)), .Names = c("ID", "Date",
"A", "B", "C", "D"), row.names = c(NA, -10L), class = c("data.table",
"data.frame"))
解决方案
这是一个tidyverse
解决方案。这种filter
情况值得解释一下:
ID
首先,我们按andDate
和 group_by排序ID
- 然后,对于每个 ID(因为我们按 ID 分组),我们应用过滤条件:
- 测试每一行是否有任何变量
> 0
- 在这种情况下获取所有行(在组中)的行号
- 找到最低的(因为行是按日期排序的,这将是最早的)
- 获取该
Date
行的值。 - 然后过滤
Date
比>=
这更多的行。
- 测试每一行是否有任何变量
由于我们仍在按 分组ID
,所有这些计算将分别针对每个组进行:
df %>%
arrange(ID, Date) %>%
group_by(ID) %>%
filter(Date >= Date[min(which(A > 0 | B > 0 | C > 0 | D > 0))])
# A tibble: 7 x 6
# Groups: ID [2]
ID Date A B C D
<int> <int> <int> <int> <int> <int>
1 101 43232 0 0 1 0
2 101 43268 0 0 0 0
3 101 43306 0 2 0 0
4 101 43338 0 0 0 0
5 103 43246 1 1 0 0
6 103 43264 0 0 0 0
7 103 43310 0 0 0 0
推荐阅读
- chart.js - chartjs在悬停时显示最近点
- javascript - Mesibo 未读消息组数
- c++ - C++20:如何以最大精度从 std::string 转换为 std::chrono::system_clock::time_point?
- reactjs - React.cloneElement 和打字稿
- android - 如何在flutter中打开应用内浏览器窗口中的链接以及如何更改浏览器窗口标题
- angular - 使用 Primeng 的 MegaMenu 组件,如何让我的嵌套选项与“routerLink”交互
- php - 是否可以在 laravel 中的不同主机、不同用户、不同数据库中引用外键?
- reactjs - 是否可以在不使用模板的情况下在轨道上进行反应?
- python - python tkinter添加多个组合框值显示问题
- java - 我怎样才能使视频也能与视觉一起正常工作?