【问题标题】:compare to next row group data.frame - count per group比较下一行组 data.frame - 每组计数
【发布时间】:2016-06-23 10:01:36
【问题描述】:

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

我想计算每月一个只有一个)潮湿的日子跟在干燥的日子之后的次数——所有年份的平均值。数据存储在 data.frame 中。或者说简单点: 我想计算下一行 (x+1) 的值 > 0 的次数,如果行 x 对于组(月)的值为零 - 所有年份的平均值。

我首先认为我可以尝试与在 stackoverflow 论坛中使用问题 compare to next row group 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

感谢所有帮助/提示/技巧 :) !

【问题讨论】:

  • 不是5天吗?第一个 0 和 2 个非零,然后是第二个零和 1 个非零,然后是第三个零和 2 个非零。
  • 感谢您的评论!我要改写一点。它是 A 湿天跟干天的次数。这也是我举这个例子的原因;)

标签: r compare match


【解决方案1】:

这是我认为您正在寻找的 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]

【讨论】:

  • 感谢您的意见!然而,这不是我想要的,或者我可能错误地执行了它。对于所有 12987 行,我得到一个新列 drywetpermonth,其中 N/A 或 133 或 134。我只需要平均每个月干燥天数之后的潮湿天数。所以我想要一个新的 data.table 或向量,只有 12 行用于 drywethpermonth。此列的结果应始终介于 0 和 16 之间。因为您不能有超过 16 次的雨天跟踪每个月的旱天。因此,新表看起来就像示例中给出的那样。
  • sum(..., na.rm = TRUE)
  • @T.BruceLee 你每个月要求sum,不是吗?现在,如果您需要平均值,只需使用 mean 而不是 sum
  • @docendodiscimus 我很刻薄地尝试过。但我得到了错误:[.data.table(weatherdata, , :=(drywetpermonth, mean(PCP > : Type of RHS ('double') must match LHS ('integer')) 中的错误。检查和强制会影响性能对于最快的情况来说太多了。要么更改目标列的类型,要么自己强制 := 的 RHS(例如,使用 1L 而不是 1)
  • @T.BruceLee,先运行这个:dt[, drywetpermonth := NULL] 然后再试一次
猜你喜欢
  • 1970-01-01
  • 2015-10-05
  • 2014-11-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多