我有一个长格式的数据框,每次测量有一个观察行。我想遍历每个唯一ID并找到"最小值"每个独特个体的日期。例如,可以在三个不同的时间测量患者1,但是我想要最早的时间。我考虑按日期(按递增顺序)对数据集进行排序并删除所有重复项,但我不确定这是否是最好的方法。任何帮助或建议将不胜感激。谢谢!
答案 0 :(得分:1)
我们可以使用data.table
。将'data.frame'转换为'data.table'(setDT(df1)
),按'ID'分组,order
'日期'(假设它在Date
类或其他使用Date
as.Date
改为format
班级,并使用head
library(data.table)
setDT(df1)[order(Date), head(.SD, 1), by = ID]
答案 1 :(得分:1)
这是使用基本R的另一种方式:
<div data-color="green" class="d"></div>
<div data-color="blue" class="d"></div>
<div data-color="red" class="d"></div>
earliestDates是一个两列数据框,其最小日期为ID。合并将连接其他列中的值。
示例:
earliestDates = aggregate(list(date = df$date), list(ID = df$ID), min)
result = merge(earliestDates,df)
在set.seed(1)
ID = floor(runif(20,1,5))
day = as.Date(floor(runif(20,1,25)),origin = "2017-1-1")
weight = floor(runif(20,80,95))
df = data.frame(ID = ID, date = day, weight = weight)
> df
ID date weight
1 2 2017-01-24 92
2 2 2017-01-07 89
3 3 2017-01-17 91
4 4 2017-01-05 88
5 1 2017-01-08 87
6 4 2017-01-11 91
7 4 2017-01-02 80
8 3 2017-01-11 87
9 3 2017-01-22 90
10 1 2017-01-10 90
11 1 2017-01-13 87
12 1 2017-01-16 92
13 3 2017-01-13 86
14 2 2017-01-06 83
15 4 2017-01-21 81
16 2 2017-01-18 81
17 3 2017-01-21 84
18 4 2017-01-04 87
19 2 2017-01-19 89
20 4 2017-01-11 86
和aggregate
之后,结果为:
merge
答案 2 :(得分:1)
尝试以下dplyr
代码:
library(dplyr)
set.seed(12345)
###Create test dataset
tb <- tibble(id = rep(1:10, each = 3),
date = rep(seq(as.Date("2017-07-01"), by=10, len=10), 3),
obs = rnorm(30))
# # A tibble: 30 × 3
# id date obs
# <int> <date> <dbl>
# 1 2017-07-01 0.5855288
# 1 2017-07-11 0.7094660
# 1 2017-07-21 -0.1093033
# 2 2017-07-31 -0.4534972
# 2 2017-08-10 0.6058875
# 2 2017-08-20 -1.8179560
# 3 2017-08-30 0.6300986
# 3 2017-09-09 -0.2761841
# 3 2017-09-19 -0.2841597
# 4 2017-09-29 -0.9193220
# # ... with 20 more rows
###Pipe the dataset through dplyr's 'group_by' and 'filter' commands
tb %>% group_by(id) %>%
filter(date == min(date)) %>%
ungroup() %>%
distinct()
# # A tibble: 10 × 3
# id date obs
# <int> <date> <dbl>
# 1 2017-07-01 0.5855288
# 2 2017-07-31 -0.4534972
# 3 2017-08-30 0.6300986
# 4 2017-07-01 -0.1162478
# 5 2017-07-21 0.3706279
# 6 2017-08-20 0.8168998
# 7 2017-07-01 0.7796219
# 8 2017-07-11 1.4557851
# 9 2017-08-10 -1.5977095
# 10 2017-09-09 0.6203798