R 根据其他两列(lat、long)中的值添加唯一ID列
这个问题已经问过了,但我正在寻找一个更完整的答案/稍微修改的输出 我有一个数据集,在单独的列中包含Lat和Long值,并且希望为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”转换为序列,然后进
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
)
)