Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/78.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R根据基于多列的事件更新值_R_Date_Dataframe_Data.table - Fatal编程技术网

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

R根据基于多列的事件更新值,r,date,dataframe,data.table,R,Date,Dataframe,Data.table,我最近问了一个类似的问题,因为我把所有的“活动”都放在一个专栏里。提供的解决方案非常有效。现在我想更改设计中的一些内容,以便能够记录更详细的信息。该表显示了几年来从不同领域记录的信息。字段上的所有活动都按日期记录。现在我想添加一个“季节”列,将属于某个收获季节的所有值分组。作为收获季节,我定义了两个收获事件之间的时间。(请参阅底部的表格,了解结果应该是什么样子)。这里的问题是,有时在前一年(如2012年)播种,但在2013年收获田地。所有事件都需要归类为2013年 如果我开始记录更多信息并为所有

我最近问了一个类似的问题,因为我把所有的“活动”都放在一个专栏里。提供的解决方案非常有效。现在我想更改设计中的一些内容,以便能够记录更详细的信息。该表显示了几年来从不同领域记录的信息。字段上的所有活动都按日期记录。现在我想添加一个“季节”列,将属于某个收获季节的所有值分组。作为收获季节,我定义了两个收获事件之间的时间。(请参阅底部的表格,了解结果应该是什么样子)。这里的问题是,有时在前一年(如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")