【问题标题】:Creating a new column using ddply in the R package "plyr"在 R 包“plyr”中使用 ddply 创建一个新列
【发布时间】:2016-06-15 20:53:24
【问题描述】:

我正在研究一个动物跟踪数据集,我需要计算每个人的每个 GPS 位置的时间戳之间的时间差。 为简单起见,我的数据如下所示(让我们暂时忘记其他变量):

ID  Time
B1  6:57
B1  6:59
B1  7:03
B1  7:10
B2  6:34
B2  6:45
B2  6:47
B2  6:48
B3  6:23
B3  6:35
B3  6:46
B3  6:47

我尝试使用以下方法计算时差:

ddply(df, "ID",transform,timediff=diff(Time))

但是我收到此错误消息:

data.frame(list(ID = c(1L, 1L, 1L, 1L), Time = 8:11) 中的错误:
参数意味着不同的行数:4、3

我认为问题在于每个 Animal 的第一行没有值。有没有解决的办法?非常感谢任何帮助。

【问题讨论】:

  • 试试c(NA, diff(Time))
  • 感谢您的快速回复!!!我试过ddply(time, "Individual",transform,timediff=c(NA,diff(Time)) 但我得到一个“+”,所以我仍然缺少一些东西
  • 您缺少右括号。
  • 哎呀!非常感谢你们!我是 R 新手,还有很多事情要做!
  • 我会认真考虑使用 dplyr 而不是 plyr。这是较新的版本,因此将提供更多支持。它有很好的功能来做到这一点,比如 mutate()!

标签: r plyr


【解决方案1】:

你可以使用data.table

 library(data.table)

# create a lag variable of time by ID
setDT(data)[, timediff:=c(NA, Time[-.N]), by=ID]

dt
#>     ID Time timediff
#>  1: B1 6:57       NA
#>  2: B1 6:59        8
#>  3: B1 7:03        9
#>  4: B1 7:10       10
#>  5: B2 6:34       NA
#>  6: B2 6:45        2
#>  7: B2 6:47        4
#>  8: B2 6:48        6
#>  9: B3 6:23       NA
#>  10: B3 6:35       1
#>  11: B3 6:46       3
#>  12: B3 6:47       5

【讨论】:

    【解决方案2】:

    我们可以从base R使用ave

     df1$timediff <- with(df1, ave(as.numeric(Time), ID, FUN = function(x) c(NA, diff(x))))
    

    假设“时间”属于日期时间类。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-08-18
      • 1970-01-01
      • 2014-01-29
      • 1970-01-01
      • 2013-12-04
      • 1970-01-01
      • 2015-05-12
      相关资源
      最近更新 更多