R循环一个因子的级别以为每个级别创建一系列数字

时间:2014-10-16 13:52:33

标签: r gps split-apply-combine

我正在使用来自海狸的GPS数据处理数据帧,数据框包含带有动物ID的列(请参阅下面的$id),这是26级的因素。对于每个海狸,我们有几个GPS值 - 数量因动物而异。

我现在想要在15分钟的间隔中创建一个单独的“每次捕获后的时间”列,从0分钟开始。对于15分钟的intervall,我试图创建一个序列

TimePostRel <- seq(from = 0, along = x, by = 15)

现在我不确定如何定义x所以它指的是每个人。我应该使用拆分功能来拆分数据帧吗?我们也有一个日期/时间列,但问题是我们在白天没有GPS点(当动物睡觉时),导致我们想要从TimePostRel计算中排除的断点(我们只是想要在捕获后引用“活动时间”)。

这是数据框:

'data.frame':   6425 obs. of  22 variables:
 $ nb              : int  1 2 3 4 5 6 7 8 9 10 ...
 $ x               : num  517710 517680 NA 517625 517624 ...
 $ y               : num  6587730 6587759 NA 6587929 6588014 ...
 $ date            : POSIXct, format: "2010-04-10 05:15:00" "2010-04-10 05:30:00" "2010-04-10         05:45:00" "2010-04-10 06:00:00" ...
 $ dx              : num  -30.2 NA NA -0.4 -39.2 ...
 $ dy              : num  28.8 NA NA 85.7 126.8 ...
 $ dist            : num  41.7 NA NA 85.7 132.7 ...
 $ dt              : num  900 900 900 900 900 900 900 900 NA 900 ...
 $ R2n             : num  0 1743 NA 46880 88416 ...
 $ abs.angle       : num  2.38 NA NA 1.58 1.87 ...
 $ rel.angle       : num  NA NA NA NA 0.295 ...
 $ id              : Factor w/ 26 levels "Andreas","Apple",..: 1 1 1 1 1 1 1 1 1 1 ...
 $ burst           : Factor w/ 329 levels "Andreas.1","Andreas.2",..: 1 1 1 1 1 1 1 1 1 2 ...
 $ sex             : int  2 2 NA 2 2 2 NA 2 2 2 ...
 $ season          : int  2 2 NA 2 2 2 NA 2 2 2 ...
 $ try             : int  33 34 NA 36 37 38 NA 39 40 41 ...
 $ x.sats          : int  5 5 NA 5 5 5 NA 6 5 6 ...
 $ hdop            : num  2.1 4.2 NA 2.7 3.3 2.1 NA 2.5 2.8 2.2 ...
 $ lodge.x         : num  517595 517595 NA 517595 517595 ...
 $ lodge.y         : num  6587806 6587806 NA 6587806 6587806 ...
 $ NSD_lodge       : num  19039 9440 NA 15909 44268 ...
 $ nsd_1stGPSpoint : num  0 1743 NA 46880 88416 ...

有人知道如何解决这个问题?在此先感谢!!

干杯, 帕特里夏

2 个答案:

答案 0 :(得分:1)

您可以在data.table中快速完成此操作。我假设您的数据名为dta

library(data.table)
setDT(dta)   ## change format
dta[, TimePostRel:=seq(from = 0, along = x, by = 15), by=x]

答案 1 :(得分:0)

plyr包也可以完成此任务。对于具有一列因子的数据框,请使用ddply的转换选项:

library(plyr)
# create a data frame where column x is a factor
df <- data.frame(x=c(rep("b",6),rep("a",3),rep("c",4)))
# apply sequence to each level within x
df <- ddply(df,"x",transform,t=seq(from=0,by=15,length.out=length(x)))

请注意,新数据框的行的排序与列x的因子级别匹配:

print(df)
   x  t
1  a  0
2  a 15
3  a 30
4  a 45
5  a 60
6  a 75
7  b  0
8  b 15
9  b 30
10 c  0
11 c 15
12 c 30
13 c 45