在列而不是矩阵中获得distm结果

时间:2018-12-20 18:04:45

标签: r geosphere

我正在尝试计算两组不同位置(总共145个)之间的距离,但是输出是一个矩阵,而不是一列值。

我的数据框如下:

dist <- distm(df[2:3], df[5:6], fun = distGeo)

head(dist[,1:5])
         [,1]     [,2]     [,3]     [,4]     [,5]
[1,] 740870.5 578.1295 1804.444 1091.421 1676.753
[2,] 740870.5 578.1295 1804.444 1091.421 1676.753
[3,] 740870.5 578.1295 1804.444 1091.421 1676.753
[4,] 740870.5 578.1295 1804.444 1091.421 1676.753
[5,] 740870.5 578.1295 1804.444 1091.421 1676.753
[6,] 740870.5 578.1295 1804.444 1091.421 1676.753

我正在使用distm进行计算,但输出是一个矩阵,而不是一个具有145个值的向量(每对成对的坐标集一个)。

<html lang="en">
<head>
<meta charset="utf-8"/>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript">
$(document).ready(function() {
$('#btn').click(function() {
    $('#p3').val(0);$('#p2').val(0);
    var i;
    $('#p1').val(parseInt($('#st').val()));
    for (i = parseInt($('#st').val()); i < parseInt($('#en').val()); i++) {
        var jqxhr = $.post("downloader.php", { 'id':i }, function() {
            })
            .always(function(data) {
                if (data != 0)
                    $('#p2').val(parseInt($('#p2').val()) + 1);
                else
                    $('#p3').val(parseInt($('#p3').val()) + 1);
                $("#txt").val($("#txt").val() + "\n" + data);
                $('#p1').val(parseInt($('#p1').val()) + 1);
            });
    }

});
});
</script>
</head>
<body>
<form name="frm" id="frm">
Start from <input type="text" name="st" id="st" /> To <input type="text" name="en" id="en" /> <hr/>
Processing <input type="text" name="p1" id="p1" /> <br/>
Processed <input type="text" name="p2" id="p2" /> <br/>
Not found <input type="text" name="p3" id="p3" /> <br/>
<input type="button" id="btn" value="Start" />
</form>
<textarea id="txt" name="txt"></textarea>
</body>
</html>

编辑:

看起来像diag(dist)可以解决问题。

2 个答案:

答案 0 :(得分:1)

我认为您需要distGeo函数而不是distm函数。

distGeo函数将找到两个向量中每对点之间的距离,从而得出向量结果。
distm函数将计算第一个向量中的每个元素与第二个向量中的每个元素之间的距离,从而得出“ m×n”矩阵。

distGeo(df[,2:3], df[,5:6])
#[1] 740870.5772    578.5153   1804.5629   1091.7911   1676.4440   1495.0507


distm(df[2:3], df[5:6], fun = distGeo)
#         [,1]     [,2]     [,3]     [,4]     [,5]     [,6]
#[1,] 740870.6 578.5153 1804.563 1091.791 1676.444 1495.051
#[2,] 740870.6 578.5153 1804.563 1091.791 1676.444 1495.051
#[3,] 740870.6 578.5153 1804.563 1091.791 1676.444 1495.051
#[4,] 740870.6 578.5153 1804.563 1091.791 1676.444 1495.051
#[5,] 740870.6 578.5153 1804.563 1091.791 1676.444 1495.051
#[6,] 740870.6 578.5153 1804.563 1091.791 1676.444 1495.051 

答案 1 :(得分:0)

as.vector将矩阵转换为向量(列方式):

as.vector(dist)

,或者如果您希望按行操作:

as.vector(t(dist))

如果需要保留坐标,一种方法是:

df <- as.data.frame(dist) 
names(df) <- c("dist.1", "dist.2")
reshape(data = df, direction = "long", varying = 1:2)

(可选)您可以使用坐标命名列:

reshape(data = df, direction = "long", varying = 1:2, timevar = "x", idvar = "y")