valores una studio seleccionar filas eliminar datos data contar columnas columna cambiar r order r-factor

studio - Ordene un factor basado en el valor en una o más columnas



eliminar na en r (2)

He revisado una serie de publicaciones sobre los factores de pedido, pero no he encontrado ninguna coincidencia para mi problema. Desafortunadamente, mi conocimiento de R es todavía bastante rudimentario.

Tengo un subconjunto de un catálogo de artefactos arqueológicos con el que estoy trabajando. Estoy tratando de tabular los tipos de artefactos históricos de diagnóstico y las ubicaciones de prueba del sitio. Bastante fácil con ddply o tapply.

Mi problema es que quiero ordenar los tipos de artefactos (un factor) por su fecha de diagnóstico promedio (número / año), y los obtengo alfabéticamente. Sé que necesito convertirlo en un factor ordenado, pero no puedo averiguar cómo ordenarlo por el valor del año en la otra columna.

IDENTIFY MIDDATE engine-turned fine red stoneware 1769 white salt-glazed stoneware, scratch blue 1760 wrought nail, ''L'' head 1760 yellow lead-glazed buff earthenware 1732 ...

Que necesita ser ordenado:

IDENTIFY MIDDATE yellow lead-glazed buff earthenware 1732 white salt-glazed stoneware, scratch blue 1760 wrought nail, ''L'' head 1760 engine-turned fine red stoneware 1769 ...

El factor (IDENTIFICAR) debe ordenarse por la Fecha (MIDDATE). Pensé que lo tenía con

Catalog$IDENTIFY<-factor(Catalog$IDENTIFY,levels=Catalog$MIDDATE,ordered=TRUE)

pero recibe la advertencia:

In `levels<-`(`*tmp*`, value = if (nl == nL) as.character(labels) else paste0(labels,: duplicated levels will not be allowed in factors anymore

IDENTIFY tiene ~ 130 niveles de factor y muchos tienen el mismo valor para MIDDATE, por lo que necesito pedir IDENTIFY por MIDDATE y otra columna TYPENAME.

Un poco más de detalle:

Tengo un Catalog marcos de datos, que se descompone (es decir, str(Catalog) ) como:

> str(Catalog) ''data.frame'': 2211 obs. of 15 variables: $ TRENCH : Factor w/ 7 levels "DRT 1","DRT 2",..: 1 1 1 1 1 1 1 1 1 1 ... $ U_TYPE : Factor w/ 3 levels "EU","INC","STP": 1 1 1 1 1 1 1 1 1 1 ... $ U_LBL : Factor w/ 165 levels "001","005","007",..: 72 72 72 72 72 72 ... $ L_STRAT : Factor w/ 217 levels "#2-7/25","[3]",..: 4 4 4 4 4 4 89 89 89 89 ... $ START : num 0 0 0 0 0 0 39.4 39.4 39.4 39.4 ... $ END : num 39.4 39.4 39.4 39.4 39.4 39.4 43.2 43.2 43.2 43.2 ... $ Qty : int 1 1 3 5 1 1 6 8 1 1 ... $ MATNAME : Factor w/ 6 levels "Ceramics","Chipped Stone",..: 1 1 1 5 5 6 ... $ TYPENAME: Factor w/ 9 levels "Architectural Hardware",..: 9 9 9 1 1 3 9 ... $ CATNAME : Factor w/ 32 levels "Biface","Bottle Glass",..: 24 29 29 6 24 ... $ IDENTIFY: Factor w/ 112 levels "amethyst bottle glass",..: 17 91 96 71 103 ... $ BEGDATE : int 1820 1820 1830 1835 1700 NA 1670 1762 1800 1720 ... $ ENDDATE : int 1900 1970 1860 1875 1820 NA 1795 1820 1820 1780 ... $ OCC_LBL : Ord.factor w/ 5 levels "Late 19th Century"<..: 2 1 2 2 4 5 4 3 ... $ MIDDATE : num 1860 1895 1845 1855 1760 ...

Necesito que IDENTIFY un factor ordenado, y reordenar por MIDDATE -> TYPENAME -> alpha por IDENTIFY .

Lo que realmente no entiendo es cómo reordenar por órdenes combinadas de varias columnas.

Simplemente haría esto en la base de datos, pero gran parte de lo que estoy ejecutando son medios ponderados dentro de todo tipo de tabulaciones cruzadas (por ejemplo, profundidades de medias ponderadas debajo de la superficie del suelo para las clases de artefactos por ubicación) ...

... factible en Access, pero desordenado e impredecible. Es mucho más fácil y limpio de administrar en R, pero prefiero no tener que reordenar manualmente las tablas resultantes.

Lo que estoy tratando de producir es una serie de cosas en este sentido:

>xtab.Catalog<-tapply(Catalog$Qty,list(Catalog$IDENTIFY,Catalog$TRENCH),sum) IDENTIFY DRT1 DRT2 DRT3 DRT4 DRT5 DRT6 Staffordshire stoneware 4 NA NA NA NA NA undecorated delftware 6 4 NA NA NA NA unidentified wrought nail 15 9 3 1 3 NA white salt-glazed stoneware 6 1 1 NA 2 1 white salt-glazed scratch blue 1 NA NA NA NA NA white stoneware, slip-dipped NA NA NA NA NA NA wrought nail, ''L'' head 2 NA NA NA NA NA wrought nail, ''rose'' head 62 21 4 NA 1 1 wrought nail, ''T'' head 2 NA 1 NA NA 1 yellow lead-glazed 12 NA NA NA 1 3 ...

... pero los necesito para clasificar en el orden lógico (es decir, cronológico / tipo) en lugar de alfabético.

Gracias.

La solución ganadora resultó ser:

Catalog$IDENTIFY = factor(Catalog$IDENTIFY, levels = + Catalog$IDENTIFY[order(Catalog$MIDDATE, Catalog$MATNAME, + Catalog$TYPENAME, Catalog$CATNAME, Catalog$IDENTIFY)], ordered=TRUE) Catalog$IDENTIFY <- factor(Catalog$IDENTIFY[,drop=TRUE]) str(Catalog$IDENTIFY) Ord.factor w/ 112 levels "brown-dotted yellow lead-glazed buff earthenware"<..: 63 85 48 59 17 112 4 24 36 8 ...


Aquí hay una muestra reproducible, con solución:

set.seed(0) a = sample(1:20,replace=F) b = sample(1:20,replace=F) f = as.factor(letters[1:20]) > a [1] 18 6 7 10 15 4 13 14 8 20 1 2 9 5 3 16 12 19 11 17 > b [1] 16 18 4 12 3 5 6 1 15 10 19 17 9 11 2 8 20 7 13 14 > f [1] a b c d e f g h i j k l m n o p q r s t Levels: a b c d e f g h i j k l m n o p q r s t

Ahora para el nuevo factor:

fn = factor(f, levels=unique(f[order(a,b,f)]), ordered=TRUE) > fn [1] a b c d e f g h i j k l m n o p q r s t 20 Levels: k < l < o < f < n < b < c < i < m < d < s < q < g < h < e < ... < j

Ordenado en ''a'', la siguiente ''b'' y finalmente la propia ''f'' (aunque en este ejemplo, ''a'' no tiene valores repetidos).


Recomiendo el siguiente enfoque basado en dplyr (h / t daattali ) que puede extenderse a tantas columnas como desee:

library(dplyr) Catalog <- Catalog %>% arrange(MIDDATE, TYPENAME) %>% # sort your dataframe mutate(IDENTIFY = factor(IDENTIFY, unique(IDENTIFY))) # reset your factor-column based on that order