2012-11-26 25 views
18

Voglio creare un ID univoco in R basato su due colonne di latitudine e longitudine in modo che le posizioni duplicate abbiano lo stesso ID cluster.Aggiungi colonna ID per gruppo

Ad esempio:

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 

risposta

24

Ecco un modo utilizzando 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: Incorporated @ suggerimento di Spacedman di fornire drop=TRUE-interaction.

+2

Aggiunta 'goccia = TRUE al vostro' chiamata interaction' vi darà i numeri da 1 a 5, piuttosto che i codici di ricerca casuale che avete qui. – Spacedman

+0

ok, ho un'ulteriore domanda a proposito. i miei dati dovrebbero avere anni per il 1990: 2010 ma per la maggior parte dei cluster mancano alcuni anni. Voglio che R cerchi quali mancano e poi inserirli. Inoltre, voglio anche creare NA per la variabile di risposta e duplicare le altre variabili nei nuovi casi che sono stati creati. aiuto, per favore, se puoi. grazie, Jones – jonestats

+0

@ user1835888 I commenti non sono il posto migliore per chiedere. Pubblica un'altra domanda con un esempio riproducibile che mostra ciò che hai provato e qualcuno ti aiuterà. –

12

I dati:

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) 

Questi comandi creano una variabile id iniziano 1:

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

L'output:

 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 inserito data.table 1.8.3, che consente di effettuare le seguenti operazioni:

# 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

Grazie a tutti per le risposte. stanno funzionando perfettamente e mi ha risparmiato un sacco di tempo. dopo aver creato un ID univoco, la prossima cosa che vorrei fare è duplicare alcuni campi e creare NA per gli altri. i miei dati sono in anni e non tutti i cluster hanno dati per tutti gli anni, quindi prima voglio riempire gli anni mancanti (1990: 2010) per tutti gli id. quindi riempire il resto dei campi in cui ho aggiunto gli anni e creare NA per gli altri dove voglio prevedere. – jonestats

3

confrontare le prestazioni suggerito soluzioni:

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 
Problemi correlati