[R] Subset by Factor by date
Marc Schwartz
marc_schwartz at comcast.net
Sat Jun 14 06:24:22 CEST 2008
on 06/13/2008 11:10 PM T.D.Rudolph wrote:
> I have a dataframe, x, with over 60,000 rows that contains one Factor, "id",
> with 27 levels.
> The dataframe contains numerous continuous values (along column "diff") per
> day (column "date") for every level of id. I would like to select only one
> row per animal per day, i.e. that containing the minimum value of "diff",
> along the full length of 1:nrow(x). I am not yet able to conduct anything
> beyond the simplest of functions and I was hoping someone could suggest an
> effective way of producing this output.
>
> e.g. given this input:
>
> id day diff
> 1 01-01-09 0.5
> 1 01-01-09 0.7
> 2 01-01-09 0.2
> 2 01-01-09 0.4
> 1 01-02-09 0.1
> 1 01-02-09 0.3
> 2 01-02-09 0.3
> 2 01-02-09 0.4
>
> I would like to produce this output:
> id day diff
> 1 01-01-09 0.5
> 2 01-01-09 0.2
> 1 01-02-09 0.1
> 2 01-02-09 0.3
>
> It doesn't seem extremely difficult but I'm sure there are easier ways than
> how I am currently approaching it!
See ?aggregate
> DF
id day diff
1 1 01-01-09 0.5
2 1 01-01-09 0.7
3 2 01-01-09 0.2
4 2 01-01-09 0.4
5 1 01-02-09 0.1
6 1 01-02-09 0.3
7 2 01-02-09 0.3
8 2 01-02-09 0.4
> aggregate(DF$diff, list(id = DF$id, day = DF$day), min, na.rm = TRUE)
id day x
1 1 01-01-09 0.5
2 2 01-01-09 0.2
3 1 01-02-09 0.1
4 2 01-02-09 0.3
Note that I have not converted the 'day' column to a 'date' class. You
would need to do that to perform any other date related operations
(including chronological sorting) on that column. See ?as.Date for more
information. For example:
DF$day <- as.Date(DF$day, format = "%m-%d-%y")
HTH,
Marc Schwartz
More information about the R-help
mailing list