基于日期的数据子集基于R中的标准

时间:2018-03-27 21:05:38

标签: r

我有一个包含2列和多行的数据框,一列中有重复的ID,另一列有多个日期。如何通过ID创建前两个记录的数据子集?

  • - ID日期
    • A 1/1/18 18:34
    • A 1/1/18 18:35
    • A 1/1/18 18:35
    • A 1/1/18 18:36
    • A 1/1/18 18:37
    • A 1/1/18 18:38
    • A 1/1/18 18:39
    • B 1/1/18 18:34
    • B 1/1/18 18:35
    • B 1/1/18 18:35
    • B 1/1/18 18:36
    • B 1/1/18 18:37
    • B 1/1/18 18:38
    • B 1/1/18 18:39
    • C 1/1/18 18:34
    • C 1/1/18 18:35
    • C 1/1/18 18:36
    • C 1/1/18 18:36
    • C 1/1/18 18:36
    • C 1/1/18 18:37
    • C 1/1/18 18:38

预期结果:

  
      
  • ID日期      
        
    • A 1/1/18 18:34
    •   
    • A 1/1/18 18:35
    •   
    • B 1/1/18 18:34
    •   
    • B 1/1/18 18:35
    •   
    • C 1/1/18 18:34
    •   
    • C 1/1/18 18:35
    •   
  •   

2 个答案:

答案 0 :(得分:0)

您可以使用data.table包创建一个按ID和日期顺序计算记录的字段,如下所示:

data <- data[, count := sequence(.N), by = c('ID', 'Date')][]

然后,您可以根据count

对数据进行子集化
result <- subset(data, count <= 2)

答案 1 :(得分:0)

我编辑这篇文章是为了澄清这种方法。此代码段包含group by根据列ID,后跟headdates列,该列检索每个不同ID的前两个实例。假设日期的格式为:

dates = c('Date 1 A', 'Date 2 A', 'Date 3 A', 'Date 4 A', 'Date 5 A', 'Date 6 A', 'Date 7 A',
          'Date 1 B', 'Date 2 B', 'Date 3 B', 'Date 4 B', 'Date 5 B', 'Date 6 B', 'Date 7 B',
          'Date 1 C', 'Date 2 C', 'Date 3 c', 'Date 4 c', 'Date 5 c', 'Date 6 c', 'Date 7 c')

因此,每个ID(A,B和C)都有7个不同的日期,这些日期标有相应的ID我还假设数据集按IDdates排序。

现在,按ID分组并使用head(<columnwewanttosubset>, 2)

ID <- rep(c('A','B','C'), c(7,7,7))

df <- data.table(ID,dates)

df[, .(Dates = head(dates,2)), by = ID]

#    ID    Dates
# 1:  A Date 1 A
# 2:  A Date 2 A
# 3:  B Date 1 B
# 4:  B Date 2 B
# 5:  C Date 1 C
# 6:  C Date 2 C

因此,您可以看到输出是每个dates的前两个ID

已编辑 (见上文)

我建议data.table

library(data.table)

dates <- c('1/1/18 18:34','1/1/18 18:35','1/1/18 18:35','1/1/18 18:36','1/1/18 18:37','1/1/18 18:38','1/1/18 18:39','1/1/18 18:34','1/1/18 18:35','1/1/18 18:35','1/1/18 18:36','1/1/18 18:37','1/1/18 18:38','1/1/18 18:39','1/1/18 18:34','1/1/18 18:35','1/1/18 18:36','1/1/18 18:36','1/1/18 18:36','1/1/18 18:37','1/1/18 18:38')
ID <- rep(c('A','B','C'), c(7,7,7))

df <- data.table(ID,dates)

df[,head(dates,2), by = ID]

#    ID           V1
# 1:  A 1/1/18 18:34
# 2:  A 1/1/18 18:35
# 3:  B 1/1/18 18:34
# 4:  B 1/1/18 18:35
# 5:  C 1/1/18 18:34
# 6:  C 1/1/18 18:35