R基于基于多列的事件更新值

时间:2014-01-14 05:50:16

标签: r date dataframe data.table

我最近问过一个类似的问题here,将所有“活动”放在一列中。提供的解决方案非常有效。现在我想改变设计中的一些东西,以便能够记录更详细的信息。该表显示了几年来从不同领域记录的信息。字段上的所有活动都按日期进行记录。现在我想添加一个“季节”专栏,该专栏将属于收获季节的所有值组合在一起。作为收获季节,我定义了两次收获事件之间的时间。 (请参阅底部的表格,了解结果应该如何)。这里的问题是播种有时在前一年(例如2012年)进行,但是田地在2013年收获。所有活动都需要分组为2013年。

如果我开始记录更多信息并将所有“活动”分别列为一个列,我需要更改哪些内容?我试过了:

    library(data.table)

DF <- read.table(text="ID|Field|Date      |Tillage|Seeding|Fertilizer|Spraying|Harvest
 1|A    |2012/08/01|Plough   |NA|NA|NA|NA
 2|A    |2012/08/24|NA   |Wheat|NA|NA|NA
 3|A    |2013/03/05|NA  |NA|NA|ProduktA|NA
 4|A    |2013/03/05|NA|NA|TypeB|NA|NA
 5|A    |2013/07/25|NA   |NA|NA|NA|9t
 6|B    |2012/09/01|Plough   |NA|NA|NA|NA
 7|B    |2012/09/05|NA   |Barley|NA|NA|NA
 8|B    |2013/04/05|NA  |NA|NA|ProductB|NA
 9|B    |2013/07/28|NA   |NA|NA|NA|10t
10|B    |2010/08/24|Cultivator   |NA|NA|NA|NA
11|B    |2010/09/29|NA   |NA|NA|NA|NA
12|B    |2011/05/01|NA|NA|TypeB|NA|NA
13|B    |2011/07/12|NA   |NA|NA|NA|6t
14|A    |2011/09/01|NA   |Barley|NA|NA|NA
15|A    |2011/10/10|NA  |NA|NA|ProductC|NA
16|A    |2012/04/10|NA|NA|TypeA|NA|NA
17|A    |2012/08/02|NA   |NA|NA|NA|7t|", 
                 sep="|", header=TRUE, stringsAsFactors=FALSE)

DT <- data.table(DF)
DT[, Harvest:=gsub(" ", "", Harvest, fixed=TRUE)]
DT[, Date:=as.POSIXct(Date)]
setkeyv(DT, c("Field", "Date"))
DT[, Season:=cumsum(c("", !is.na(head(Harvest, -1)))), by=Field]
DT[, Season:=max(year(Date)), by=list(Field, Season)]

然而,这似乎不起作用。结果看起来应该是这样的,最后一个“季节”栏目表示了这个季节:

ID|Field|Date      |Tillage|Seeding|Fertilizer|Spraying|Harvest|Season
1|A    |2012/08/01|Plough   |NA|NA|NA|NA|2013
 2|A    |2012/08/24|NA   |Wheat|NA|NA|NA|2013
 3|A    |2013/03/05|NA  |NA|NA|ProduktA|NA|2013
 4|A    |2013/03/05|NA|NA|TypeB|NA|NA|2013
 5|A    |2013/07/25|NA   |NA|NA|NA|9t|2013
 6|B    |2012/09/01|Plough   |NA|NA|NA|NA|2013
 7|B    |2012/09/05|NA   |Barley|NA|NA|NA|2013
 8|B    |2013/04/05|NA  |NA|NA|ProductB|NA|2013
 9|B    |2013/07/28|NA   |NA|NA|NA|10t|2013
10|B    |2010/08/24|Cultivator   |NA|NA|NA|NA|2011
11|B    |2010/09/29|NA   |NA|NA|NA|NA|2011
12|B    |2011/05/01|NA|NA|TypeB|NA|NA|2011
13|B    |2011/07/12|NA   |NA|NA|NA|6t|2011
14|A    |2011/09/01|NA   |Barley|NA|NA|NA|2012
15|A    |2011/10/10|NA  |NA|NA|ProductC|NA|2012
16|A    |2012/04/10|NA|NA|TypeA|NA|NA|2012
17|A    |2012/08/02|NA   |NA|NA|NA|7t||2012

1 个答案:

答案 0 :(得分:0)

与OP的other question的唯一区别在于,还有一些额外的列,并且需要修改用于提取应用my rolling join answer的收获日期的条件:

library(data.table)
setDT(DF)[!is.na(Harvest), .(Field, Date, Season = year(Date))][
  DF, on = .(Field, Date), roll = -Inf] 
    Field       Date Season ID    Tillage Seeding Fertilizer Spraying Harvest
 1:     A 2012/08/01   2012  1     Plough      NA         NA       NA      NA
 2:     A 2012/08/24   2013  2         NA   Wheat         NA       NA      NA
 3:     A 2013/03/05   2013  3         NA      NA         NA ProduktA      NA
 4:     A 2013/03/05   2013  4         NA      NA      TypeB       NA      NA
 5:     A 2013/07/25   2013  5         NA      NA         NA       NA      9t
 6:     B 2012/09/01   2013  6     Plough      NA         NA       NA      NA
 7:     B 2012/09/05   2013  7         NA  Barley         NA       NA      NA
 8:     B 2013/04/05   2013  8         NA      NA         NA ProductB      NA
 9:     B 2013/07/28   2013  9         NA      NA         NA       NA     10t
10:     B 2010/08/24   2011 10 Cultivator      NA         NA       NA      NA
11:     B 2010/09/29   2011 11         NA      NA         NA       NA      NA
12:     B 2011/05/01   2011 12         NA      NA      TypeB       NA      NA
13:     B 2011/07/12   2011 13         NA      NA         NA       NA      6t
14:     A 2011/09/01   2012 14         NA  Barley         NA       NA      NA
15:     A 2011/10/10   2012 15         NA      NA         NA ProductC      NA
16:     A 2012/04/10   2012 16         NA      NA      TypeA       NA      NA
17:     A 2012/08/02   2012 17         NA      NA         NA       NA      7t

请注意,滚动连接在样本数据集中存在缺陷。第1行显示2012赛季,尽管随后的收获(根据OP的ID)应该在2013年。原因是耕地和收获的日期混合在A区。第1行的A区的耕作日期是2012/08/01而第17行中相同字段的收获日期是2012/08/02,耕种后的一天

如果列顺序很重要,setcolorder()函数可用于对列进行排序,即无需复制:

result <- setDT(DF)[!is.na(Harvest), .(Field, Date, Season = year(Date))][
  DF, on = .(Field, Date), roll = -Inf]
setcolorder(result, c(names(DF), "Season"))[]
    ID Field       Date    Tillage Seeding Fertilizer Spraying Harvest Season
 1:  1     A 2012/08/01     Plough      NA         NA       NA      NA   2012
 2:  2     A 2012/08/24         NA   Wheat         NA       NA      NA   2013
 3:  3     A 2013/03/05         NA      NA         NA ProduktA      NA   2013
 4:  4     A 2013/03/05         NA      NA      TypeB       NA      NA   2013
 5:  5     A 2013/07/25         NA      NA         NA       NA      9t   2013
 6:  6     B 2012/09/01     Plough      NA         NA       NA      NA   2013
 7:  7     B 2012/09/05         NA  Barley         NA       NA      NA   2013
 8:  8     B 2013/04/05         NA      NA         NA ProductB      NA   2013
 9:  9     B 2013/07/28         NA      NA         NA       NA     10t   2013
10: 10     B 2010/08/24 Cultivator      NA         NA       NA      NA   2011
11: 11     B 2010/09/29         NA      NA         NA       NA      NA   2011
12: 12     B 2011/05/01         NA      NA      TypeB       NA      NA   2011
13: 13     B 2011/07/12         NA      NA         NA       NA      6t   2011
14: 14     A 2011/09/01         NA  Barley         NA       NA      NA   2012
15: 15     A 2011/10/10         NA      NA         NA ProductC      NA   2012
16: 16     A 2012/04/10         NA      NA      TypeA       NA      NA   2012
17: 17     A 2012/08/02         NA      NA         NA       NA      7t   2012

数据

library(data.table)
DF <- fread(
  "ID|Field|Date      |Tillage|Seeding|Fertilizer|Spraying|Harvest
 1|A    |2012/08/01|Plough   |NA|NA|NA|NA
 2|A    |2012/08/24|NA   |Wheat|NA|NA|NA
 3|A    |2013/03/05|NA  |NA|NA|ProduktA|NA
 4|A    |2013/03/05|NA|NA|TypeB|NA|NA
 5|A    |2013/07/25|NA   |NA|NA|NA|9t
 6|B    |2012/09/01|Plough   |NA|NA|NA|NA
 7|B    |2012/09/05|NA   |Barley|NA|NA|NA
 8|B    |2013/04/05|NA  |NA|NA|ProductB|NA
 9|B    |2013/07/28|NA   |NA|NA|NA|10t
10|B    |2010/08/24|Cultivator   |NA|NA|NA|NA
11|B    |2010/09/29|NA   |NA|NA|NA|NA
12|B    |2011/05/01|NA|NA|TypeB|NA|NA
13|B    |2011/07/12|NA   |NA|NA|NA|6t
14|A    |2011/09/01|NA   |Barley|NA|NA|NA
15|A    |2011/10/10|NA  |NA|NA|ProductC|NA
16|A    |2012/04/10|NA|NA|TypeA|NA|NA
17|A    |2012/08/02|NA   |NA|NA|NA|7t")