R根据基于多列的事件更新值
我最近问了一个类似的问题,因为我把所有的“活动”都放在一个专栏里。提供的解决方案非常有效。现在我想更改设计中的一些内容,以便能够记录更详细的信息。该表显示了几年来从不同领域记录的信息。字段上的所有活动都按日期记录。现在我想添加一个“季节”列,将属于某个收获季节的所有值分组。作为收获季节,我定义了两个收获事件之间的时间。(请参阅底部的表格,了解结果应该是什么样子)。这里的问题是,有时在前一年(如2012年)播种,但在2013年收获田地。所有事件都需要归类为2013年 如果我开始记录更多信息并为所有“活动”单独列一列,我需要做哪些更改?我试过:R根据基于多列的事件更新值,r,date,dataframe,data.table,R,Date,Dataframe,Data.table,我最近问了一个类似的问题,因为我把所有的“活动”都放在一个专栏里。提供的解决方案非常有效。现在我想更改设计中的一些内容,以便能够记录更详细的信息。该表显示了几年来从不同领域记录的信息。字段上的所有活动都按日期记录。现在我想添加一个“季节”列,将属于某个收获季节的所有值分组。作为收获季节,我定义了两个收获事件之间的时间。(请参阅底部的表格,了解结果应该是什么样子)。这里的问题是,有时在前一年(如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)]
与OP的唯一区别在于,有一些附加列,提取应用收获日期的条件需要修改:
library(data.table)
setDT(DF)[!is.na(Harvest), .(Field, Date, Season = year(Date))][
DF, on = .(Field, Date), roll = -Inf]
请注意,滚动联接在示例数据集中显示了一个缺陷。第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"))[]
资料
库(data.table)
DF正如我在另一篇文章中回复您的评论时所写的那样,显而易见的解决方案是将数据重塑为长格式。我看不出有什么理由将其保留为宽幅格式,因为数据非常稀疏,您不需要所有这些NA
值。我同意罗兰的观点。顺便说一句:i)fread
比读取更方便。表
,您可以像在这里做的那样向它传递一个字符串数据;ii)请不要说“似乎不起作用”,这对我们没有多大帮助。究竟哪里不对;是否有错误消息或输出错误?除了罗兰和马特的建议外,请注意,您正在将seasure
强制转换为字符串。如果要填充cumsum
请使用NA
而不是“
”。正如在cumsum(c(NA_real_uu,!is.NA(head(Harvest,-1)))
中一样,显然,样本数据集中存在缺陷。第1行A田的耕作日期为2012/08/01,第17行A田的收获日期为2012/08/02,即耕作后一天。
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
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")