循环使用独特的价值观

时间:2017-01-07 05:49:02

标签: r loops

我有一个长格式的数据框,每次测量有一个观察行。我想遍历每个唯一ID并找到"最小值"每个独特个体的日期。例如,可以在三个不同的时间测量患者1,但是我想要最早的时间。我考虑按日期(按递增顺序)对数据集进行排序并删除所有重复项,但我不确定这是否是最好的方法。任何帮助或建议将不胜感激。谢谢!

3 个答案:

答案 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