对列对执行功能

时间:2012-04-24 20:06:09

标签: r

我正在尝试对动物位置数据进行一些蒙特卡罗模拟。到目前为止,我已经采样了100次X和Y坐标,100次。这导致200的列表。然后我将此列表转换为一个数据帧,这个数据帧更适合我想为每个样本(kernel.area)运行的最终函数。

现在我有一个包含200列的数据框,我想使用每对连续的列执行kernel.area函数。

我无法在这里很好地重现我自己的数据,所以我试图给出一个基本的例子来展示我正在使用的数据框架的结构。我已经包含了迄今为止我尝试过的for循环,但我仍然是R新手并且会感谢任何建议。

# generate dataframe representing X and Y positions
df <- data.frame(x=seq(1:200),y=seq(1:200)) 

# 100 replications of sampling 100 "positions"
resamp <- replicate(100,df[sample(nrow(df),100),])

# convert to data frame (kernel.area needs an xy dataframe)
df2 <- do.call("rbind", resamp[1:2,])
# xy positions need to be in columns for kernel.area
df3 <- t(df2)

#edit: kernel.area requires you have an id field, but I am only dealing with one individual, so I'll construct a fake one of the same length as the positions
id=replicate(100,c("id"))
id=data.frame(id)

这是我试过的for循环的结构(自第一篇文章以来编辑过):

for (j in seq(1,ncol(df3)-1,2)) { 
  kud <- kernel.area(df3[,j:(j+1)],id=id,kern="bivnorm",unin=c("m"),unout=c("km2"))
  print(kud)
}

我的最终目标是为每个重采样事件计算kernel.area(即每对列最多200行1:100),并能够在数据帧中组合结果。但是,在运行循环后,我收到以下错误消息:

Error in df[, 1] : incorrect number of dimensions

编辑:我意识到我的id格式与我的数据框不一样,所以我改了它,现在有了错误:

Error in kernelUD(xy, id, h, grid, same4all, hlim, kern, extent) : 
id should have the same length as xy

1 个答案:

答案 0 :(得分:2)

首先,免责声明:我从未使用过具有adehabitat函数的程序包kernel.area,我假设您正在使用它。也许你可以确认哪个包包含有问题的功能。


我认为我可以提出一些建议,这些建议与特定包的知识无关。

  1. 第一个是创建df3。这应该是 df3 <- t(df2),但这很可能在您的实际代码中是正确的 而且你的帖子只是一个错字。

  2. 第二个建议与你在df3中分组的方式有关 环。 j:j+1只是一个数字,因为:有更高的数字 优先级高于+(请参阅?Syntax的顺序 数学运算在R)中进行。获得所需的两个 列,请改用j:(j+1)


  3. 修改

    加载adehabitat时,我被警告过#34;小心&#34;并使用相关的新包,其中包含adehabitatHR,其中还包含函数kernel.area。这个函数的语法和行为略有不同,但也许值得一试。使用adehabitatHR(我必须从源代码安装,因为该软件包不适用于R 2.15.0),我能够执行以下操作。

    library(adehabitatHR)
    
    for (j in seq(1,ncol(df3)-1,2)) { 
      kud <-kernelUD(SpatialPoints(df3[,j:(j+1)]),kern="bivnorm")
      kernAr<-kernel.area(kud,unin=c("m"),unout=c("km2"))
      print(kernAr)
    }
    
    detach(package:adehabitatHR, unload=TRUE)
    

    这会打印一些内容,如下面的评论中所述,kernelUD()之前会调用kernel.area()