5

我有一个包含三列的数据框:参考、目标、距离。每个参考都具有到同一组目标的测量距离,我想获得每个参考的最小距离向量。现在我正在使用 for 循环执行此操作,但似乎应该有一种方法可以对其进行矢量化。

这是我的代码:

refs <- levels(data$ref)

result <- c()
for (ref in refs) {
    # Find the minimum distance for observations with the current ref
    # but be sure to protect against ref == target!
    best_dist <- min(data[data$ref == ref & data$target != ref,]$distance)
    result <- c(result, best_dist)
}

我注定要以这种方式设置我的数据框,还是有一种很好的方法来矢量化它?谢谢您的帮助!

4

1 回答 1

6

c永远不要在循环中使用, cbind,来增长对象rbind。每次都会复制该对象。而是预先分配到正确的大小(或者如果结果是流动的,则高估)。

话虽如此,这里不需要循环

我喜欢data.tables 的内存效率和编码优雅。

 library(data.table)
 DT <- data.table(data)


 DT[ref != target, list(bestdist = min(distance)), by = ref] 

如果 ref 和 target 是具有不同级别的因子列(如评论中所建议的那样),则要么使它们具有相同的级别,要么转换为字符

 DT[as.character(ref) != as.character(target),  list(bestdist = min(distance)), by = ref] 
于 2013-02-08T00:54:18.280 回答