R:改进循环以从数据帧创建距离矩阵

时间:2014-04-11 12:44:11

标签: r loops matrix distance

我正在使用R中数据框的数据创建距离矩阵。

我的数据框的温度为2244个位置:

plot    temperature
A       12
B       12.5
C       15
...     ...

我想创建一个矩阵,显示每对位置之间的温差:

.   A    B    C
A   0    0.5  3
B   0.5  0    0.5
C   3    2.5  0

这是我在R中提出的:

temp_data  #my data frame with the two columns: location and temperature

temp_dist<-matrix(data=NA, nrow=length(temp_data[,1]), ncol=length(temp_data[,1]))
temp_dist<-as.data.frame(temp_dist)
names(temp_dist)<-as.factor(temp_data[,1]) #the locations are numbers in my data
rownames(temp_dist)<-as.factor(temp_data[,1])

for (i in 1:2244)
{
  for (j in 1:2244)
  {
   temp_dist[i,j]<-abs(temp_data[i,2]-temp_data[j,2])
  }
}

我尝试使用以下小样本编写代码:

 for (i in 1:10)

它工作正常。 我的问题是计算机已经运行了整整两天而且还没有完成。

我想知道是否有办法更快地做到这一点。我知道循环中的循环需要很多次,我试图填充超过500万个单元格的矩阵,这是有道理的,它需要这么长时间,但我希望有一个公式可以获得相同的结果更快的时间因为我必须对降水和其他变量做同样的事情。

我也读到了dist,但我不确定使用数据框我是否可以使用该公式。

我非常感谢您的合作。

非常感谢。

2 个答案:

答案 0 :(得分:1)

您是否只是在寻找以下内容?

out <- dist(temp_data$temperature, upper=TRUE, diag=TRUE)
out
#     1   2   3
# 1 0.0 0.5 3.0
# 2 0.5 0.0 2.5
# 3 3.0 2.5 0.0

如果您需要不同的行/列名称,您似乎必须先将其转换为矩阵:

out_mat <- as.matrix(out)
dimnames(out_mat) <- list(temp_data$plot, temp_data$plot)
out_mat
#     A   B   C
# A 0.0 0.5 3.0
# B 0.5 0.0 2.5
# C 3.0 2.5 0.0

答案 1 :(得分:1)

或者只是作为工具箱的替代选择:

m <- with(temp_data, abs(outer(temperature, temperature, "-")))
dimnames(m) <- list(temp_data$plot, temp_data$plot)
m
#     a   b   c
# a 0.0 0.5 3.0
# b 0.5 0.0 2.5
# c 3.0 2.5 0.0