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

时间:2014-01-27 11:01:19

标签: r

我试图计算一个指数,但我仍然坚持暗示日期的公式步骤。

以下是我输入的一部分:

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()混合使用,你对我如何在几天内获得差异有所了解吗?

1 个答案:

答案 0 :(得分:1)

?Dates表示:

  

日期表示为自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