【问题标题】:R loop over levels of a factor to create a sequence of numbers for each levelR循环遍历因子的级别以为每个级别创建一系列数字
【发布时间】:2014-10-16 13:52:33
【问题描述】:

我正在处理一个包含来自海狸的 GPS 数据的数据帧,该数据帧包括带有动物 ID 的列(请参阅下面的 $id),这是一个包含 26 个级别的因子。对于每只海狸,我们都有几个 GPS 值 - 数字因动物而异。

我现在想以 15 分钟的间隔为每个人创建一个单独的列,其中包含“捕获后的时间”,从 0 分钟开始。对于 15 分钟的间隔,我尝试创建一个序列

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

现在我不确定如何定义 x,所以它指的是每个人。我应该使用 split 函数来拆分数据框吗?我们也有日期/时间列,但问题是我们在白天(当动物睡觉时)没有 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 ...

现在有人知道如何解决这个问题吗?提前致谢!!

干杯, 帕特里夏

【问题讨论】:

    标签: r gps split-apply-combine


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      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
      

      【讨论】:

        猜你喜欢
        • 2023-03-18
        • 1970-01-01
        • 1970-01-01
        • 2014-04-12
        • 1970-01-01
        • 2019-07-29
        • 2021-03-06
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多