如果列满足要求,则应用函数

时间:2017-08-07 22:51:32

标签: r subset apply

我可能会考虑太多,或者没有足够的思考。无法决定哪个。我使用包(BBMM)使用x,y坐标和时间延迟构建野生动物的运动模型(如BBMM中函数brownian.bridge()所要求的那样)。

我的问题是该功能一次只对一个人起作用。我有一个数据框(绵羊),有20个人用ID(CollarSerialNumber)指定,如下所示:

  

绵羊

       CollarSerialNumber  EASTING NORTHING Time.lag
1                  37434 824635.2  2186799        0
2                  37434 824640.5  2186798      360
3                  37434 824644.8  2186791      360
4                  37434 824668.9  2186739      360
5                  37434 824637.6  2186786      360
6                  37435 824640.7  2186787      360
7                  37435 824648.1  2186784      360
8                  37435 824653.3  2186789      360
9                  37435 824644.7  2186797      360
10                 37435 824640.5  2186800      360
11                 37436 824637.5  2186791      360
12                 37436 824637.5  2186791      360
13                 37436 824647.8  2186800      360
14                 37436 824644.7  2186796      360
15                 37436 824637.6  2186787      360
16....

该功能如下所示:

brownian.bridge(x, y, time.lag, location.error, cell.size)

x,y和time.lag由数据框提供,另外两个是手动输入的。它看起来像这样:

BBMMID=brownian.bridge(x=sheep$Easting, y=sheep$Northing, 
                       time.lag=sheep$Time.lag[-1], 
                       location.error=20, cell.size=30)

当数据框只包含一个ID时,该功能正常工作。我一直在把我的整个csv文件分成20个独立的csv文件,基于ID(一个用于37434,37435等),这很好用。然而,这个过程既繁琐又耗时。如果列满足某个要求,我正在寻找一种在一组行上应用函数的方法。

例如,如果我想在整个数据框中将此函数应用于JUST 37434而不需要在excel中解决问题(我对代码不是很有经验,如果你不能告诉我们!)我该怎么办呢?这会是一个if-then问题吗?申请功能?子集<?/ P>

1 个答案:

答案 0 :(得分:0)

考虑by输出brownian.bridge输出列表,该列表等于 CollarSerialNumber 的不同数量。作为信息,?by按所选因子对数据帧进行切片,并将过滤到每个因子值的数据帧传递到其 FUN 调用中:

objList <- by(sheep, sheep$collarSerialNumber, FUN=function(df) 
              brownian.bridge(x=df$Easting, y=df$Northing, 
                              time.lag=df$Time.lag[-1], 
                              location.error=20, cell.size=30))

要访问objList中的第一个对象,请使用数字或名称引用:

objList[[1]]

objList$`37434`