简体   繁体   中英

R: loop through data frame extracting subset of data depending on date

I have a large data frame that consists of data that looks something like this:

        date    w    x    y    z    region
1    2012 01    21   43   12    3   NORTH
2    2012 02    32   54   21   16   NORTH
3    2012 03    14   32   65   32   NORTH
4    2012 04    65   33   75   21   NORTH
:        :      :    :    :    :       :
:        :      :    :    :    :       :
12   2012 12    32   58   53   17   NORTH
13   2012 01    12   47   43   23   SOUTH
14   2012 02    87   43   21   76   SOUTH
:        :      :    :    :    :       :
25   2012 01    12   46   84   29    EAST
26   2012 02    85   29   90   12    EAST
:        :      :    :    :    :       :
:        :      :    :    :    :       :

I want to extract section of the data that have the same date value, for example to do this just for 2012 01 I would just create a subset of data

data_1 <- subset(data, date == "2012 01")

and this gives me all the data for 2012 01 but I then go on to apply a function to this data. I would like to be able to apply my function to all possible subsets of my data, so ideally I would be looping through my large data frame and extracting the data for 2012 01, 2012 02, 2012 03, 2012 04... and applying a function to each of these subsets of data separately.

But I would like to be able to apply this to my data frame even if my data frames length were to change, so it may not always go from 2012 01 - 2012 12 , the range of dates may vary so that sometimes it may be used on data from for example 2011 03 - 2013 01 .

Loop through each unique date and build the subset.

uniq <- unique(unlist(data$Date))
for (i in 1:length(uniq)){
    data_1 <- subset(data, date == uniq[i])
    #your desired function
}

is this what you want ? df_list <- split(data, as.factor(data$date))

After sub-setting your dataset by date, imagine that the function you would like to apply to each subset is to find the mean of the column x . You could do it this way: (df is your dataframe)

 library(plyr)
 ddply(df, .(date), summarize, mean = mean(x))

您可以将data.frame拆分为data.frames list ,如下所示:

list.of.dfs<-by(data,data$date)

This is a perfect situation for the plyr package:

require(plyr)
ddply(my_df, .(date), my_function, extra_arg_1, extra_arg_2)

where my_function is the function you want to perform on the split data frames, and extra_arg s are any extra arguments that need to go to that function.

ddply ( d ata frame -> d ata frame) is the form you want if you want your results in a data frame; dlply returns a list.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM