比较下一行组data.frame - 每组计数

时间:2016-06-23 10:01:37

标签: r compare match

我对R很陌生,我试图解决以下问题。

我想计算 a 只有一个)湿润日每月干燥一天的次数 - 这是所有年份的平均值。数据存储在data.frame中。或者说它很简单: 我想计算下一行(x + 1)的值> gt的次数;如果行x的值为零,则为0(月) - 所有年份的平均值。

我首先想到我可以像在stackoverflow论坛中那样尝试它,问题是比较下一行组data.table 。不幸的是我收到了错误:

 Error in `[.data.frame`(weatherdata, , `:=`(PCPnextdat, PCP[match(Date +  : unused argument (by = Month)

执行以下任务时:

 weatherdata[, PCPnextdat := PCP[match(Date + 1, Date)] , by=Month]

数据文件中的重要列,我们称之为 weatherdata 具有以下结构,并且是36年的数据 - 从01Jan1979到31July2014:

 Date Year Month Day PCP
1979-01-01 1979 01 01 0.000
1979-01-02 1979 01 02 0.987   <---- FIRST DAY
1979-01-03 1979 01 03 0.876
1979-01-04 1979 01 04 0.000
1979-01-05 1979 01 05 0.234   <---- SECOND DAY
1979-01-06 1979 01 06 0.000
1979-01-07 1979 01 07 0.123   <----- THIRD DAY
1979-01-08 1979 01 08 1.899

因此,在此示例中,干燥天后的湿天数为3天。

我已经找到了一种用降水数据(x + 1)制作新柱子的方法。 使用:

 weatherdataPCP.next <- weatherdata..5341$PCP[c(2:12986,1)]

这会给:

Date Year Month Day PCP PCP.next
1979-01-01 1979 01 01 0.000 0.987 <--- ONE
1979-01-02 1979 01 02 0.987 0.876
1979-01-03 1979 01 03 0.876 0.000
1979-01-04 1979 01 04 0.000 0.234 <--- TWO
1979-01-05 1979 01 05 0.234 0.000
1979-01-06 1979 01 06 0.000 0.123 <--- THIRD
1979-01-07 1979 01 07 0.123 1.899
1979-01-08 1979 01 08 1.899 0.000

我最终想要的是:

Month dry.wet.p.month
01 9.23
02 12.14
03 9.51
04 8.71
05 13.11
06 9.09
07 6.55
08 7.22
09 10.67
10 4.23
11 5.67
12 7.54

所有帮助/提示/技巧都很受欢迎:)!

1 个答案:

答案 0 :(得分:2)

这是我认为你正在寻找的data.table选项。首先,汇总每月年的湿/干组合数。然后,仅计算每月的总和的平均值。

library(data.table)
setDT(dt)

dt[, list(drywetpermonth = sum(PCP > 0 & shift(PCP == 0), na.rm = TRUE)), 
     by = list(Year, Month)][
   , list(drywetpermonth = mean(drywetpermonth)), by = Month]
相关问题