我正在寻找一种根据其他条件快速将数据帧中的值从F更改为T的方法。这些条件基于其他数据框中的值。我找到了几种可行的方法,但是我在这里寻找速度。
我尝试在filter
中用dplyr
进行子集化,并且还使用mutate
/ replace
进行子集化。我还尝试了基本的R []
表示法。我想知道*apply
路由是否会更快,但不确定如何实现这些功能。
在这里,我首先创建一个距离为Dist_mat
的向量,然后在另一个距离为阈值以下的data frame
中替换值。我使用which
找到了这些近距离。我还有其他一些条件。这里的coords$t
和coords$j
只是ID变量。我想在coords
和我的t_vectors
对象之间进行匹配。
for (k in 1:nrow(coords)) {
Dist_mat<- pointDistance(coords[k,1:2], coords[,1:2], lonlat = F)
t_vectors<- t_vectors %>% mutate(binary=replace(binary,
t_vectors$t==coords$t[k] & t_vectors$j==coords$j[k] & t_vectors$Frame %in% coords$t[which(Dist_mat<3.5)], T))
}
再次运行此代码没问题。我只想加快速度,因为我的Dist_mat
有5000项,而且我必须重复很多次。我也知道使用for
循环是不好的做法,但是我不确定在这种情况下如何避免循环。
好吧,我被要求提供一些可重现的数据,这有点棘手,但是可以了。
library(raster)
Dist_mat<- sample(1:10, 50, replace = T)
coords<- as.data.frame(matrix(data = NA, ncol = 2, nrow = 50))
colnames(coords)<- c('t', 'j')
coords$t<- 1:50
coords$j<- rep(1:5, 10)
t_vectors<- as.data.frame(matrix(data = NA, ncol = 2, nrow = 50))
colnames(t_vectors)<- c('t', 'j')
t_vectors$t<- sample(1:50, 50, replace = F)
t_vectors$j<- sample(1:5, 50, replace = T)
t_vectors$Frame<- sample(1:5, 50, replace=T)
t_vectors$binary<- F`
在我的实际示例中,Dist_mat
会发生变化,但我在这里只是保持不变。 Ive使用一些基准测试来确定创建Dist_mat
的速度很快,而其过滤部分则很慢。