R 按组列出的所有可能坐标对之间的最大距离
我需要找到单个ID移动到Lambert坐标的最大距离(绝对距离,而不是累计距离) 我有以下数据集:R 按组列出的所有可能坐标对之间的最大距离,r,max,grouping,distance,R,Max,Grouping,Distance,我需要找到单个ID移动到Lambert坐标的最大距离(绝对距离,而不是累计距离) 我有以下数据集: rownum <- c(1,2,3,4,5,6,7,8) ID <- c(1,1,1,1,2,3,3,3) years <- c(1994, 1994, 1995, 1995, 1994, 1998, 1999, 1999) coorx <- c(160501,160507,160507,160508,
rownum <- c(1,2,3,4,5,6,7,8)
ID <- c(1,1,1,1,2,3,3,3)
years <- c(1994, 1994, 1995, 1995, 1994, 1998, 1999, 1999)
coorx <- c(160501,160507,160507,160508,160638,160402,160402,160707)
coory <- c(202549,202727,202727,202488,202701,202586,202586,202548)
test <- as.data.frame(cbind(rownum, ID, years, coorx, coory))
rownum以下是如何使用dplyr
实现这一点。基本上,我首先按
ID对u进行分组,然后使用select
删除rownum和years列。然后,我在ID usinffull\u join
上将数据与其自身合并。这将创建坐标对。它还创建从第1年到第2年的坐标变化,反之亦然,但这不是问题,因为我们将只保留max
。然后我使用mutate
创建一个新的dist列,最后,我使用summary
仅通过ID保持max
距离
test <- as.data.frame(cbind(rownum, ID, years, coorx, coory))
test %>%
group_by(ID) %>%
select(ID,coorx, coory) %>%
full_join(.,.,by="ID") %>%
mutate(dist=sqrt((coorx.x-coorx.y)^2+(coory.x-coory.y)^2)) %>%
summarise(max_dist=max(dist,na.rm=TRUE))
# A tibble: 3 x 2
ID max_dist
<dbl> <dbl>
1 1 239.0021
2 2 0.0000
3 3 307.3581
最后,这里介绍了如何对data.table
执行相同的操作。我首先将数据合并到ID上,然后使用:=
操作符创建一个新的dist列,最后,我只保留max
按ID的距离
test <- as.data.table(cbind(ID, coorx, coory))
merged <- merge(test,test,by=c("ID"),allow.cartesian=TRUE)
merged[,dist:=sqrt((coorx.x-coorx.y)^2+(coory.x-coory.y)^2) ]
merged[,.(max_dist=max(dist,na.rm=TRUE)),by=ID]
ID max_dist
1: 1 239.0021
2: 2 0.0000
3: 3 307.3581
test以下是如何使用dplyr
实现这一点。基本上,我首先按
ID对u进行分组,然后使用select
删除rownum和years列。然后,我在ID usinffull\u join
上将数据与其自身合并。这将创建坐标对。它还创建从第1年到第2年的坐标变化,反之亦然,但这不是问题,因为我们将只保留max
。然后我使用mutate
创建一个新的dist列,最后,我使用summary
仅通过ID保持max
距离
test <- as.data.frame(cbind(rownum, ID, years, coorx, coory))
test %>%
group_by(ID) %>%
select(ID,coorx, coory) %>%
full_join(.,.,by="ID") %>%
mutate(dist=sqrt((coorx.x-coorx.y)^2+(coory.x-coory.y)^2)) %>%
summarise(max_dist=max(dist,na.rm=TRUE))
# A tibble: 3 x 2
ID max_dist
<dbl> <dbl>
1 1 239.0021
2 2 0.0000
3 3 307.3581
最后,这里介绍了如何对data.table
执行相同的操作。我首先将数据合并到ID上,然后使用:=
操作符创建一个新的dist列,最后,我只保留max
按ID的距离
test <- as.data.table(cbind(ID, coorx, coory))
merged <- merge(test,test,by=c("ID"),allow.cartesian=TRUE)
merged[,dist:=sqrt((coorx.x-coorx.y)^2+(coory.x-coory.y)^2) ]
merged[,.(max_dist=max(dist,na.rm=TRUE)),by=ID]
ID max_dist
1: 1 239.0021
2: 2 0.0000
3: 3 307.3581
test考虑一个自连接(SQL speak),其中您将数据帧按ID合并到自身上,以实现所有可能组合的交叉连接(即笛卡尔积)。然后根据公式计算距离,并按ID计算max
的聚合距离:
merge_df <- merge(test, test, by="ID", suffixes=c("1", "2"))
merge_df$dist <- with(merge_df, sqrt((coorx2-coorx1)^2+(coory2-coory1)^2))
max_dist <- aggregate(dist~ID, merge_df, FUN=max)
max_dist
# ID dist
# 1 1 239.0021
# 2 2 0.0000
# 3 3 307.3581
考虑一个自连接(SQL speak),其中您将数据帧合并到自身上,以按ID进行所有可能组合的交叉连接(即笛卡尔积)。然后根据公式计算距离,并按ID计算最大值的聚合:
merge_df <- merge(test, test, by="ID", suffixes=c("1", "2"))
merge_df$dist <- with(merge_df, sqrt((coorx2-coorx1)^2+(coory2-coory1)^2))
max_dist <- aggregate(dist~ID, merge_df, FUN=max)
max_dist
# ID dist
# 1 1 239.0021
# 2 2 0.0000
# 3 3 307.3581
使用data.table
和.SD
rownum <- c(1,2,3,4,5,6,7,8)
ID <- c(1,1,1,1,2,3,3,3)
years <- c(1994, 1994, 1995, 1995, 1994, 1998, 1999, 1999)
coorx <- c(160501,160507,160507,160508,160638,160402,160402,160707)
coory <- c(202549,202727,202727,202488,202701,202586,202586,202548)
test <- as.data.frame(cbind(rownum, ID, years, coorx, coory))
library(data.table)
setDT(test)
test[,
max(
dist(
.SD[1:.N, .(coorx, coory)]
)
),
by = ID
]
rownum使用data.table
和.SD
rownum <- c(1,2,3,4,5,6,7,8)
ID <- c(1,1,1,1,2,3,3,3)
years <- c(1994, 1994, 1995, 1995, 1994, 1998, 1999, 1999)
coorx <- c(160501,160507,160507,160508,160638,160402,160402,160707)
coory <- c(202549,202727,202727,202488,202701,202586,202586,202548)
test <- as.data.frame(cbind(rownum, ID, years, coorx, coory))
library(data.table)
setDT(test)
test[,
max(
dist(
.SD[1:.N, .(coorx, coory)]
)
),
by = ID
]
rownum