2012-11-26 64 views
18

Tôi muốn tạo một ID duy nhất trong R dựa trên hai cột vĩ độ và kinh độ để các vị trí trùng lặp có cùng một ID nhóm.Thêm cột ID theo nhóm

Ví dụ:

LAT  LONG Cluster_ID 
13.5330 -15.4180 1 
13.5330 -15.4180 1 
13.5330 -15.4180 1 
13.5330 -15.4180 1 
13.5330 -15.4170 2 
13.5330 -15.4170 2 
13.5330 -15.4170 2 
13.5340 -14.9350 3 
13.5340 -14.9350 3 
13.5340 -15.9170 4 
13.3670 -14.6190 5 

Trả lời

24

Dưới đây là một trong những cách sử dụng interaction.

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 

EDIT: Thành lập @ đề nghị Spacedman để cung cấp drop=TRUE-interaction.

+2

Thêm 'thả = TRUE' cho 'gọi interaction' của bạn sẽ cung cấp cho bạn số 1-5 chứ không phải là các mã tìm kiếm ngẫu nhiên bạn có ở đây. – Spacedman

+0

ok, tôi có thêm một câu hỏi nữa. dữ liệu của tôi nên có nhiều năm cho năm 1990: 2010 nhưng đối với hầu hết các cụm, một số năm bị thiếu. tôi muốn R để tìm kiếm mà là mất tích sau đó điền chúng vào. hơn nữa, tôi cũng muốn tạo NA cho biến phản ứng và nhân đôi các biến khác trong các trường hợp mới đã được tạo ra. xin vui lòng giúp đỡ nếu u có thể. cảm ơn, Jones – jonestats

+0

@ user1835888 Nhận xét không phải là nơi tốt nhất để hỏi. Đăng câu hỏi khác với ví dụ có thể tái hiện cho biết bạn đã thử gì và ai đó sẽ giúp bạn. –

12

Dữ liệu:

dat <- 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) 

Những lệnh này tạo ra một biến id bắt đầu với 1:

comb <- with(dat, paste(LAT, LONG)) 
within(dat, Cluster_ID <- match(comb, unique(comb))) 

Sản lượng:

 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 
11

.GRP đã được thêm vào data.table 1.8.3, cho phép bạn làm như sau:

# Your data, as a data.frame 
dat <- 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) 

# Convert it to a data.table 
# with keys as the combination of LAT and LONG 
library(data.table) 
DT <- data.table(dat, key="LAT,LONG") 
DT[, Cluster_ID:=.GRP, by=key(DT)] 
DT 
#  LAT LONG Cluster_ID 
# 1: 13.367 -14.619   1 
# 2: 13.533 -15.418   2 
# 3: 13.533 -15.418   2 
# 4: 13.533 -15.418   2 
# 5: 13.533 -15.418   2 
# 6: 13.533 -15.417   3 
# 7: 13.533 -15.417   3 
# 8: 13.533 -15.417   3 
# 9: 13.534 -15.917   4 
# 10: 13.534 -14.935   5 
# 11: 13.534 -14.935   5 
+0

Cảm ơn mọi người đã trả lời. chúng hoạt động hoàn hảo và nó đã giúp tôi tiết kiệm rất nhiều thời gian. sau khi tạo một id duy nhất, điều tiếp theo tôi muốn làm là sao chép một số trường và tạo NA cho người khác. dữ liệu của tôi là trong nhiều năm và không phải tất cả các cụm đều có dữ liệu cho tất cả các năm, vì vậy đầu tiên tôi muốn lấp đầy những năm còn thiếu (1990: 2010) cho tất cả các id. sau đó điền vào phần còn lại của các lĩnh vực mà tôi đã thêm năm và tạo NA cho những người khác mà tôi muốn dự đoán. – jonestats

3

So sánh hiệu suất các giải pháp đề nghị:

df <- 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) 
f1 <- function(df, cols) { 
    df$id <- as.numeric(interaction(df[cols], drop = TRUE)) 
    df 
} 
f2 <- function(df, cols) { 
    comb <- do.call(paste, c(as.list(df[cols]), sep = ".")) 
    df$id <- match(comb, unique(comb)) 
    df 
} 
f2(df, 1:2) 
#>  LAT LONG 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 
microbenchmark::microbenchmark(f1(df, 1:2), f2(df, 1:2)) 
#> Unit: microseconds 
#>   expr  min  lq  mean median  uq  max neval cld 
#> f1(df, 1:2) 486.400 510.422 575.26659 573.3945 594.1165 1622.243 100 b 
#> f2(df, 1:2) 72.952 79.208 86.09265 83.5275 89.7195 159.740 100 a 
Các vấn đề liên quan