【问题标题】:Create edgelist of all possible combinations创建所有可能组合的边缘列表
【发布时间】:2016-06-12 01:11:36
【问题描述】:

我有一个数据框,其中包含人员列表和他们工作地点的相应纬度坐标。本质上,我想创建一个新的数据框,它代表一个边缘列表,显示原始数据框中每个人与所有其他人之间的距离。我知道如何计算距离,但在我的 for 循环中苦苦挣扎。

原始数据框如下所示(coord = tuple):

name, coord
Bob -30, 142
Jack 32, 3
Alfred 40, - 116

我需要像这样生成新的数据框:

from, to, from_coord, to_coord
Bob, Bob, -30, 142, -30, 142
Bob, Jack, -30, 142, 32, 3
Bob, Alfred, -30, 142, 40, -116
Jack, Jack 32, 3, 32, 3
Jack, Alfred 32, 3, 40, -116
Alfred, Alfred 40, -116, 40, -116

排序后,我可以轻松计算距离。

我尝试使用两个嵌套的 for 循环来创建它,但我正在填满我的 cbind,rbinds。

【问题讨论】:

    标签: r


    【解决方案1】:

    这是使用setNameswith 然后使用expand.grid 的基本解决方案

    x <- with(df, setNames(name, coord))
    x1 <- cbind(expand.grid(x,x),expand.grid(names(x),names(x)))
    colnames(x1)<-c("from","to","from_coord","to_coord")
    
        from     to from_coord to_coord
    1    Bob    Bob   -30, 142 -30, 142
    2   Jack    Bob      32, 3 -30, 142
    3 Alfred    Bob   40, -116 -30, 142
    4    Bob   Jack   -30, 142    32, 3
    5   Jack   Jack      32, 3    32, 3
    6 Alfred   Jack   40, -116    32, 3
    7    Bob Alfred   -30, 142 40, -116
    8   Jack Alfred      32, 3 40, -116
    9 Alfred Alfred   40, -116 40, -116
    

    【讨论】:

    • 这适用于我提供的元组示例。但是,我注意到坐标数据存储为数据框而不是元组。我会继续努力。感谢您的快速回复!
    • 我的数据框结构如下: Classes 'tbl_df' and 'data.frame': 18 obs。 2 个变量: $ name : chr "Erik" "Datha" "Tom" "Valerie" ... $ coordinate:'data.frame': 18 obs。 2个变量:..$ lon:num 147 153 147 147 147 .....$ lat:num -42.9 -27.5 -42.9 -42.9 -42.9 ...
    • 尝试 dput(head(your_data, n = 20)) 如果它可以改善事情,尽管 jalapic 可以工作并且按照您所说的去做,因为您可以计算距离。 setNames 适用于向量(可能是您的“元组”)以及 df。
    • 有趣的是,当我在有坐标数据帧时尝试 head(df) 时出现此错误:[.data.frame(X[[i]], ...) 中的错误:选择了未定义的列。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-10
    • 2018-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-18
    相关资源
    最近更新 更多