I fattori possono aiutare a prevenire alcuni tipi di errori di programmazione in R: non è possibile eseguire controlli di uguaglianza per fattori che utilizzano livelli diversi e si viene avvisati quando si eseguono controlli superiori/inferiori rispetto a fattori non ordinati.Unire in modo sicuro i frame di dati per colonne fattoriali
a <- factor(letters[1:3])
b <- factor(letters[1:3], levels=letters[4:1])
a == b
## Error in Ops.factor(a, b) : level sets of factors are different
a < a
## [1] NA NA NA
## Warning message:
## In Ops.factor(a, a) : < not meaningful for factors
Tuttavia, contrariamente alle mie aspettative, questo controllo non viene eseguito quando si unisce frame di dati:
ad <- data.frame(x=a, a=as.numeric(a))
bd <- data.frame(x=b, b=as.numeric(b))
merge(ad, bd)
## x a b
## 1 a 1 4
## 2 b 2 3
## 3 c 3 2
Questi fattori sembrano semplicemente essere costretto a caratteri.
È disponibile una "unione sicura" da qualche parte per il controllo? Vedete ragioni specifiche per non fare questo controllo di default?
Esempio (caso di utilizzo della vita reale): Si supponga di due insiemi di dati spaziali con suddivisione molto simile ma non identica, ad esempio, nei comuni. I set di dati si riferiscono a punti leggermente diversi nel tempo e alcuni dei comuni si sono fusi in quel lasso di tempo. Ogni set di dati ha una colonna "ID comune", forse chiamata anche identicamente. Mentre la semantica di questa colonna è molto simile, non vorrei (accidentalmente) unire i set di dati su questa colonna di ID di comuni. Invece, costruisco una tabella di corrispondenza tra gli ID comuni "vecchi" e "nuovi". Se gli ID dei comuni sono codificati come fattori, una "unione sicura" darebbe un controllo di correttezza per l'operazione di unione senza costi aggiuntivi (di implementazione) e costi computazionali molto bassi.
IIUC, preferiresti un errore in questo caso perché i livelli non corrispondono? – Arun
@Arun: In molti casi d'uso preferirei un errore, o per lo meno un avvertimento. – krlmlr
Capisco. Per curiosità, in che modo consideri questo non sicuro? – Arun