Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 按组列出的所有可能坐标对之间的最大距离_R_Max_Grouping_Distance - Fatal编程技术网

R 按组列出的所有可能坐标对之间的最大距离

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,

我需要找到单个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,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 usinf
full\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 usinf
full\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