【问题标题】:Apply a function based on rows position in a subset根据子集中的行位置应用函数
【发布时间】:2014-01-27 11:01:19
【问题描述】:

我正在尝试计算索引,但我遇到了暗示日期的公式步骤。

这是我输入的一部分:

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 子集中的每一行,我需要计算一行日期和前一行日期之间的时间差(以天为单位) ((Row x) - (row 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() 混合,您对我如何在几天内获得差异有一些想法吗?

【问题讨论】:

  • as.numeric(DIFF) 怎么样?

标签: r


【解决方案1】:

?Dates说:

日期表示为自 1970 年 1 月 1 日以来的天数,其中 较早日期的负值。

所以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

【讨论】:

  • 哦,我早该知道的!谢谢!
猜你喜欢
  • 2021-07-22
  • 2015-03-15
  • 2019-10-16
  • 1970-01-01
  • 2021-11-20
  • 2021-10-13
  • 1970-01-01
  • 2019-01-14
  • 2021-11-23
相关资源
最近更新 更多