r-根据另外两列(lat,long)中的值添加唯一的ID列



有人问过这个问题,但我正在寻找一个更完整的答案/稍微修改一下的输出。

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

我将借用一个旧帖子中的示例数据集,问同样的问题,但我需要一个稍微不同的解决方案(按组添加ID列(。

d <- read.table(text='LAT LONG
13.5330 -15.4180 
13.5330 -15.4180 
13.5330 -15.4180 
13.5330 -15.4180 
13.5330 -15.4170 
13.5330 -15.4170 
13.5330 -15.4170 
13.5340 -14.9350 
13.5340 -14.9350 
13.5340 -15.9170 
13.3670 -14.6190', header=TRUE)

给出的解决方案是:

d <- transform(d, Cluster_ID = as.numeric(interaction(LAT, LONG, drop=TRUE)))
#       LAT    LONG Cluster_ID
# 1  13.533 -15.418          2
# 2  13.533 -15.418          2
# 3  13.533 -15.418          2
# 4  13.533 -15.418          2
# 5  13.533 -15.417          3
# 6  13.533 -15.417          3
# 7  13.533 -15.417          3
# 8  13.534 -14.935          4
# 9  13.534 -14.935          4
# 10 13.534 -15.917          1
# 11 13.367 -14.619          5

但是,如何让interaction命令保持顺序,使上面的第一个Cluster_ID为1(最后一列的全向量为1,1,1,1,2,2,3,4,5,而不是2,2,2,3,4,4,1,5(?目前尚不清楚新的因子顺序(转换为数字(是如何确定的。

我也一直在尝试在dplyr中使用group_by找到实现这一点的等效方法,但不知道如何将tibble表输出为数据帧(SO上的旧解决方案似乎使用了贬值的dplyr命令(。

谢谢!

我们可以使用match

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

或者将"LAT"、"LONG"转换为序列,然后执行interaction

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

使用.GRPdata.table选项

> 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的评论(

> 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

或使用ave+cumsum的基本R选项

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

相关内容

最新更新