R:根据日期循环数据帧提取数据子集

时间:2013-08-22 14:03:10

标签: r for-loop dataframe subset

我有一个大型数据框,其中包含如下所示的数据:

        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
:        :      :    :    :    :       :
:        :      :    :    :    :       :

我想提取具有相同date值的数据部分,例如仅为2012 01执行此操作我只想创建数据子集

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

这给了我2012 01的所有数据,但我继续将函数应用于此数据。我希望能够将我的函数应用于我的所有可能的数据子集,所以理想情况下我将循环遍历我的大数据帧并提取2012 01, 2012 02, 2012 03, 2012 04...的数据并将函数应用于这些数据子集中的每一个分别。

但是我希望能够将此应用到我的数据框中,即使我的数据框长度发生变化,因此它可能并不总是来自2012 01 - 2012 12,日期范围可能会有所不同,所以有时它会可以用于来自例如2011 03 - 2013 01的数据。

5 个答案:

答案 0 :(得分:15)

遍历每个唯一日期并构建子集。

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

答案 1 :(得分:10)

这是你想要的吗? df_list <- split(data, as.factor(data$date))

答案 2 :(得分:2)

按日期对数据集进行子设置后,假设您要应用于每个子集的函数是查找列x的平均值。你可以这样做:( df是你的数据帧)

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

答案 3 :(得分:0)

您可以将data.frame分成listdata.frames,如下所示:

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

答案 4 :(得分:0)

这是plyr包的完美情况:

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

其中my_function是您要对拆分数据帧执行的函数,extra_arg是需要转到该函数的任何额外参数。

如果您希望将结果放在数据框中,

ddplyd ata frame - &gt; d ata frame)就是您想要的表单。 dlply返回一个列表。