根据子集中的行位置应用函数

问题描述 投票:0回答:1

我正在尝试计算一个指数,但我坚持使用暗示日期的公式的一步。

以下是我输入的一部分:

YEAR     RN       DATE                      NOM                                        SITE LONG     SP                                SUMNB     NB100
2010 RNN157 2010-04-22 COMBE LAVAUX-JEAN ROLAND   RNN157-Combe Lavaux 01 Sentier des crêtes    111 Anthocharis cardamines (Linnaeus, 1758)     1 0.9009009
2010 RNN157 2010-04-26 COMBE LAVAUX-JEAN ROLAND   RNN157-Combe Lavaux 01 Sentier des crêtes    111 Anthocharis cardamines (Linnaeus, 1758)     1 0.9009009
2010 RNN157 2010-03-22 COMBE LAVAUX-JEAN ROLAND   RNN157-Combe Lavaux 01 Sentier des crêtes    111 Anthocharis cardamines (Linnaeus, 1758)     0 0.0000000
2010 RNN157 2010-09-29 COMBE LAVAUX-JEAN ROLAND   RNN157-Combe Lavaux 01 Sentier des crêtes    111 Anthocharis cardamines (Linnaeus, 1758)     0 0.0000000
2010 RNN157 2010-05-18 COMBE LAVAUX-JEAN ROLAND   RNN157-Combe Lavaux 06 Friches parc de nuit    111 Anthocharis cardamines (Linnaeus, 1758)     1 0.9009009
2010 RNN157 2010-04-15 COMBE LAVAUX-JEAN ROLAND   RNN157-Combe Lavaux 06 Friches parc de nuit    111 Anthocharis cardamines (Linnaeus, 1758)     0 0.0000000
2010 RNN157 2010-09-29 COMBE LAVAUX-JEAN ROLAND   RNN157-Combe Lavaux 06 Friches parc de nuit    111 Anthocharis cardamines (Linnaeus, 1758)     0 0.0000000

对于每个YEAR / SITE / SP子集中的每一行,我需要计算行日期和上一行日期之间的时差((行x) - (行x-1))。然后结果将存储在新列中。

我在SO上发现了一些函数允许计算行位置的东西,但由于我使用的是日期,并且由于不明原因,它会返回1970年的日期。

>DF[, DIFF := DATE - c(NA, DATE[seq_len(.N-1)])][]
 SP                                     SUMNB NB100       DIFF
Anthocharis cardamines (Linnaeus, 1758)     1 0.9009009       <NA>
Anthocharis cardamines (Linnaeus, 1758)     1 0.9009009 1970-01-05
Anthocharis cardamines (Linnaeus, 1758)     0 0.0000000 1969-11-27
Anthocharis cardamines (Linnaeus, 1758)     0 0.0000000 1970-07-11
Anthocharis cardamines (Linnaeus, 1758)     1 0.9009009 1969-08-20
Anthocharis cardamines (Linnaeus, 1758)     0 0.0000000 1969-11-29
Anthocharis cardamines (Linnaeus, 1758)     0 0.0000000 1970-06-17

我还没有达到我在tapply函数中添加此公式以便将其应用于子集的程度。

由于我没有将它与difftime()混合使用,你对我如何能在几天内获得差异有所了解吗?

r
1个回答
1
投票

?Datessays:

日期表示为1970-01-01以来的天数,早期日期为负值。

因此,DIFF中的值是以天为单位的日期差异,然后将其转换为日期对象。

diff()有什么问题?

# example data
set.seed(1)
dates <- seq(as.Date("2012-01-01"), as.Date("2013-12-31"), by="day")
dates <- dates[sort(sample(1:length(dates), size=length(dates)*.50))]
DF <- data.frame(DATES=dates)

# date diffs
DF <- transform(DF, DIFF = c(NA, diff(DATES)))
#        DATES DIFF
# 1 2012-01-09   NA
# 2 2012-01-10    1
# 3 2012-01-13    3
# 4 2012-01-16    3
# 5 2012-01-22    6
# 6 2012-01-24    2
© www.soinside.com 2019 - 2024. All rights reserved.