我最近问过一个类似的问题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
答案 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")