在R语言中计算同一个体在不同组间的位置距离差异
计算同个体不同组间的位置差异
需求:针对每个ID,计算其在date组"1"和"2"之间的位置指标(如X、Y坐标)差异,仅关注同一ID的组间对比,忽略不同ID间的距离。
解决方案(R语言)
方法1:使用dplyr分组计算差值
按ID分组后,直接提取两组的位置数据计算差值:
library(dplyr) diff_result <- df %>% group_by(ID) %>% summarise( # X坐标差值:组2 - 组1 X_diff = X_Lambert_72_m[date == "2"] - X_Lambert_72_m[date == "1"], # Y坐标差值:组2 - 组1 Y_diff = Y_Lambert_72_m[date == "2"] - Y_Lambert_72_m[date == "1"], # 计算平面欧氏距离 distance = sqrt(X_diff^2 + Y_diff^2), .groups = "drop" ) print(diff_result)
方法2:转宽表后计算差异
先将数据转为宽格式,让同一ID的两组数据处于同一行,再直接计算:
library(tidyr) library(dplyr) # 转换为宽表 wide_df <- df %>% pivot_wider( id_cols = ID, names_from = date, values_from = c(X_Lambert_72_m, Y_Lambert_72_m) ) # 计算差值与距离 diff_result <- wide_df %>% mutate( X_diff = X_Lambert_72_m_2 - X_Lambert_72_m_1, Y_diff = Y_Lambert_72_m_2 - Y_Lambert_72_m_1, distance = sqrt(X_diff^2 + Y_diff^2) ) %>% select(ID, X_diff, Y_diff, distance) print(diff_result)
结果说明
运行后会输出每个ID的三组结果:
X_diff:X坐标组2与组1的差值Y_diff:Y坐标组2与组1的差值distance:两组间的平面欧氏距离(若需三维距离,可加入Z相关字段扩展计算)
针对示例数据集,结果会显示每个ID的X差值为2.5,Y差值为0,平面距离为2.5(示例中Y坐标两组完全一致)。
内容的提问来源于stack exchange,提问作者C. Guff
相关产品推荐
相关产品推荐

