我有一个包含2列和多行的数据框,一列中有重复的ID,另一列有多个日期。如何通过ID创建前两个记录的数据子集?
预期结果:
- 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
答案 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
,后跟head
列dates
列,该列检索每个不同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
。 我还假设数据集按ID
和dates
排序。
现在,按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