R 根据其他两列(lat、long)中的值添加唯一ID列

R 根据其他两列(lat、long)中的值添加唯一ID列,r,dataframe,grouping,unique,R,Dataframe,Grouping,Unique,这个问题已经问过了,但我正在寻找一个更完整的答案/稍微修改的输出 我有一个数据集,在单独的列中包含Lat和Long值,并且希望为Lat和Long的每个唯一组合创建一个唯一的ID 我将借用一篇老文章中的示例数据集,提出相同的问题,但我需要一个稍微不同的解决方案() d我们可以使用match transform(d, Cluster_ID = match(paste0(LAT, LONG), unique(paste0(LAT, LONG)))) 或者将“LAT”、“LONG”转换为序列,然后进

这个问题已经问过了,但我正在寻找一个更完整的答案/稍微修改的输出

我有一个数据集,在单独的列中包含Lat和Long值,并且希望为Lat和Long的每个唯一组合创建一个唯一的ID

我将借用一篇老文章中的示例数据集,提出相同的问题,但我需要一个稍微不同的解决方案()


d我们可以使用
match

transform(d, Cluster_ID = match(paste0(LAT, LONG), unique(paste0(LAT, LONG))))

或者将“LAT”、“LONG”转换为序列,然后进行
交互

transform(d, Cluster_ID = as.integer(interaction(match(LAT, 
  unique(LAT)),  match(LONG, unique(LONG)), drop=TRUE, lex.order = FALSE)))

使用
.GRP

> setDT(d)[, Cluster_ID := .GRP, .(LAT, LONG)][]
       LAT    LONG Cluster_ID
 1: 13.533 -15.418          1
 2: 13.533 -15.418          1
 3: 13.533 -15.418          1
 4: 13.533 -15.418          1
 5: 13.533 -15.417          2
 6: 13.533 -15.417          2
 7: 13.533 -15.417          2
 8: 13.534 -14.935          3
 9: 13.534 -14.935          3
10: 13.534 -15.917          4
11: 13.367 -14.619          5
rleid
(感谢@akrun的评论)


或者使用
ave
+
cumsum

transform(
  d,
  Cluster_ID = cumsum(
    ave(1:nrow(d),
      LAT,
      LONG,
      FUN = seq_along
    ) == 1
  )
)

@哇,太棒了!谢谢感谢@akrun,转换为序列匹配效果很好!
> setDT(d)[, Cluster_ID := .GRP, .(LAT, LONG)][]
       LAT    LONG Cluster_ID
 1: 13.533 -15.418          1
 2: 13.533 -15.418          1
 3: 13.533 -15.418          1
 4: 13.533 -15.418          1
 5: 13.533 -15.417          2
 6: 13.533 -15.417          2
 7: 13.533 -15.417          2
 8: 13.534 -14.935          3
 9: 13.534 -14.935          3
10: 13.534 -15.917          4
11: 13.367 -14.619          5
> setDT(d)[, Cluster_ID := rleid(LAT, LONG)][]
       LAT    LONG Cluster_ID
 1: 13.533 -15.418          1
 2: 13.533 -15.418          1
 3: 13.533 -15.418          1
 4: 13.533 -15.418          1
 5: 13.533 -15.417          2
 6: 13.533 -15.417          2
 7: 13.533 -15.417          2
 8: 13.534 -14.935          3
 9: 13.534 -14.935          3
10: 13.534 -15.917          4
11: 13.367 -14.619          5
transform(
  d,
  Cluster_ID = cumsum(
    ave(1:nrow(d),
      LAT,
      LONG,
      FUN = seq_along
    ) == 1
  )
)