r中批量过程的代码修改

r中批量过程的代码修改,r,for-loop,scripting,r-factor,R,For Loop,Scripting,R Factor,在被推荐使用Adehavitage计算交叉口的交通量后,我遇到了一个小问题(希望是简单的)。在这个库中,我使用kerneloverlap命令,因为我需要计算交叉口的体积。我想知道你能否帮我解答一些编程问题。我需要修改脚本,使其“批量”处理友好。我对R的了解足以让我自己陷入麻烦和脱发,因为我知道某些事情应该是可能的,但我不知道如何让它发挥作用 命令非常简单: kerneloverlap(loc[,c("X","Y")], loc$year, lev = 90, grid=30, meth="VI"

在被推荐使用Adehavitage计算交叉口的交通量后,我遇到了一个小问题(希望是简单的)。在这个库中,我使用kerneloverlap命令,因为我需要计算交叉口的体积。我想知道你能否帮我解答一些编程问题。我需要修改脚本,使其“批量”处理友好。我对R的了解足以让我自己陷入麻烦和脱发,因为我知道某些事情应该是可能的,但我不知道如何让它发挥作用

命令非常简单:

kerneloverlap(loc[,c("X","Y")], loc$year, lev = 90, grid=30, meth="VI", conditional=TRUE)
其中,它从数据文件loc中获取x,y坐标(按年份),并在90的利用率分布中计算网格单元大小为30的交点体积

输入文件(摘录见下文)是anid、X、Y、年份和季节。对于这个例子,只有一个季节(请记住,我有三个季节)。对于这个例子,我想在一个季度内比较各个交叉口的交通量。因此,测试数据有2年1季和2个人。我想说的是“2003年至2004年期间,在产犊季节,动物1的交叉口体积为0.8,这表明高度重叠和对位置的逼真度”

我还想比较一下季节之间的差异。因此,在2003年夏季和冬季,动物1的交叉口体积为0.04,这表明重叠程度较低,且与位置无关”

需要记住的一点是:并不是所有的人每年都在场,也不是每个季节都活着。因此,可能需要一些液滴

这是到目前为止我的R脚本(不起作用)。请注意,输出也没有很好地结合在一起,我似乎无法获得编译文件。我想让它告诉我它与什么年份、个人或季节进行比较

IDNames= levels(loc$anid)
Year = unique(loc$year)
for (i in 1:(length(IDNames))){
vi90 = kerneloverlap(loc[,c("X","Y")], loc$year, lev = 90, grid=30, meth="VI", conditional=TRUE) 
    }
colnames(vi)= c(paste(IDNames[i],Year[n], sep =""),paste(IDNames[i], Year[n], sep =""))
}
write.csv(vi,"VolInter_indiv.csv")


    structure(list(anid = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L
), .Label = c("c_002", "c_104"), class = "factor"), X = c(276646.0514, 
276485.0397, 278102.4193, 278045.4716, 278993.8807, 274834.5677, 
278516.0218, 296741.8328, 299080.2451, 291874.5068, 168540.0024, 
168360.8211, 169538.2299, 164538.2592, 157321.7524, 148090.3478, 
140575.2442, 133369.7162, 134375.0805, 138763.5342, 232347.5137, 
231989.4609, 231793.1066, 234923.4012, 233374.4531, 232256.4667, 
233660.3445, 239317.3128, 246354.664, 145161.8922, 144148.7895, 
145154.7652, 145399.3515, 144581.4836, 143646.7295, 145055.3165, 
144613.1393, 145037.3035, 144701.2676), Y = c(2217588.648, 2216616.387, 
2219879.777, 2220818.804, 2216908.127, 2220423.322, 2216589.91, 
2234167.287, 2239351.696, 2232338.072, 2273737.333, 2273954.782, 
2269418.423, 2271308.607, 2264694.484, 2263710.512, 2254030.274, 
2253352.426, 2248644.946, 2262359.026, 2231404.821, 2229583.89, 
2231700.485, 2231598.882, 2237122.967, 2233302.185, 2240092.997, 
2237702.817, 2249213.958, 2261841.308, 2263064.156, 2262236.452, 
2264147.03, 2263214.877, 2263336.363, 2261417.946, 2256289.995, 
2256694.953, 2253352.576), year = c(2003L, 2003L, 2003L, 2003L, 
2003L, 2003L, 2003L, 2003L, 2003L, 2003L, 2003L, 2003L, 2003L, 
2003L, 2003L, 2003L, 2003L, 2003L, 2003L, 2003L, 2004L, 2004L, 
2004L, 2004L, 2004L, 2004L, 2004L, 2004L, 2004L, 2004L, 2004L, 
2004L, 2004L, 2004L, 2004L, 2004L, 2004L, 2004L, 2004L), season = structure(c(1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L), .Label = "calving", class = "factor")), .Names = c("anid", 
"X", "Y", "year", "season"), class = "data.frame", row.names = c(NA, 
-39L))
好的,我咬一口

您的代码有一些打字错误(我希望是这样),使其无法运行。让我们扔掉它,重新开始。函数
kerneloverlap
返回第二个参数中指定的每对项的重叠值矩阵。在第一个示例中,您比较的是年份

让我们先想象一下我们将如何处理一只动物的数据,然后编写一个函数,输出我们想要的值,只用于简单的情况:

kernMod <- function(x){
    #x is the data for a single animal
    rs <- kerneloverlap(x[,c("X","Y")],
                        x$year,lev = 90, 
                        grid = 30, 
                        meth = "VI", 
                        conditional = TRUE)
    #Assumes we're only comparing two years
    out <- data.frame(year = paste(colnames(rs),collapse="-"), val = rs[2,1])
    out
}
或者我们可以使用
plyr
软件包中的
ddply
将其依次应用于每只动物:

ddply(loc,.(anid),.fun = kernMod)

  anid      year        val
1 c_002 2003-2004 0.00000000
2 c_104 2003-2004 0.06033966
要包含多个季节,只需将其添加到变量列表中,以便在
ddply
中拆分(未测试):

要比较一年内的季节,您需要修改
kernMod
以将
x$seasure
作为第二个参数传递,然后调用类似(未测试)的内容:

如果您的完整数据中有多个年份,
kernMod
将需要更多的修改,因为
kerneloverlap
返回一个n x n矩阵,其中n是数据中的年数。可能类似这样的情况(未测试)

好的,我咬一口

您的代码有一些打字错误(我希望是这样),使其无法运行。让我们扔掉它,重新开始。函数
kerneloverlap
返回第二个参数中指定的每对项的重叠值矩阵。在第一个示例中,您比较的是年份

让我们先想象一下我们将如何处理一只动物的数据,然后编写一个函数,输出我们想要的值,只用于简单的情况:

kernMod <- function(x){
    #x is the data for a single animal
    rs <- kerneloverlap(x[,c("X","Y")],
                        x$year,lev = 90, 
                        grid = 30, 
                        meth = "VI", 
                        conditional = TRUE)
    #Assumes we're only comparing two years
    out <- data.frame(year = paste(colnames(rs),collapse="-"), val = rs[2,1])
    out
}
或者我们可以使用
plyr
软件包中的
ddply
将其依次应用于每只动物:

ddply(loc,.(anid),.fun = kernMod)

  anid      year        val
1 c_002 2003-2004 0.00000000
2 c_104 2003-2004 0.06033966
要包含多个季节,只需将其添加到变量列表中,以便在
ddply
中拆分(未测试):

要比较一年内的季节,您需要修改
kernMod
以将
x$seasure
作为第二个参数传递,然后调用类似(未测试)的内容:

如果您的完整数据中有多个年份,
kernMod
将需要更多的修改,因为
kerneloverlap
返回一个n x n矩阵,其中n是数据中的年数。可能类似这样的情况(未测试)


kernMod谢谢!这太完美了。我非常感谢你花时间解释这些步骤。这有助于我从逻辑上推理出其他脚本,因为我发现自己需要为各种计算执行这些步骤。再次感谢你!尽管你可能在开玩笑,但我完全感谢你!!!我一直在测试这个sc整个上午,我都在用批量处理的结果与一次只处理一个人的数据进行比较,我得到的结果完全不同。谢谢!这太完美了。我真的很感谢你花时间解释这些步骤。这有助于我从逻辑上推理出其他脚本,因为我发现自己需要这样做这些步骤同样适用于各种计算。再次感谢!虽然你可能是在开玩笑,但我完全感谢你!!!我整个上午都在测试这个脚本,并将批量处理的结果与一次一个数据进行比较,我得到的结果完全不同。
ddply(loc,.(anid,year),.fun = kernMod)
kernMod <- function(x){
    #x is the data for a single animal
    rs <- kerneloverlap(x[,c("X","Y")],
                        x$year,lev = 90, 
                        grid = 30, 
                        meth = "VI", 
                        conditional = TRUE)
    rs[lower.tri(rs,diag = TRUE)] <- NA
    rs <- melt(rs)
    rs <- subset(rs, !is.na(value))
    out <- data.frame(year = paste(rs$X1,rs$X2,collapse="-"), val = rs$value)
    out
}