首页 > 解决方案 > 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"))

标签: r

解决方案


这是一个tidyverse解决方案。这种filter情况值得解释一下:

  1. ID首先,我们按andDate和 group_by排序ID
  2. 然后,对于每个 ID(因为我们按 ID 分组),我们应用过滤条件:
    1. 测试每一行是否有任何变量> 0
    2. 在这种情况下获取所有行(在组中)的行号
    3. 找到最低的(因为行是按日期排序的,这将是最早的)
    4. 获取该Date行的值。
    5. 然后过滤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

推荐阅读