根据条件替换大型数据框的快速方法

时间:2019-05-08 21:47:44

标签: r dplyr apply

我正在寻找一种根据其他条件快速将数据帧中的值从F更改为T的方法。这些条件基于其他数据框中的值。我找到了几种可行的方法,但是我在这里寻找速度。

我尝试在filter中用dplyr进行子集化,并且还使用mutate / replace进行子集化。我还尝试了基本的R []表示法。我想知道*apply路由是否会更快,但不确定如何实现这些功能。

在这里,我首先创建一个距离为Dist_mat的向量,然后在另一个距离为阈值以下的data frame中替换值。我使用which找到了这些近距离。我还有其他一些条件。这里的coords$tcoords$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的速度很快,而其过滤部分则很慢。

0 个答案:

没有答案