R código de clasificar a la edad en el grupo/ contenedores/ rompe

Estoy tratando de categorizar la edad en el grupo por lo que no será continuo. Tengo este código:

data$agegrp(data$age>=40 & data$age<=49) <- 3
data$agegrp(data$age>=30 & data$age<=39) <- 2
data$agegrp(data$age>=20 & data$age<=29) <- 1

el código anterior no funciona bajo el paquete de supervivencia. Que me da:

invalid function in complex assignment

Puede que me apunte dónde está el error? data es el dataframe que estoy utilizando.

Uso [ de subconjunto, no (.
La función que debes utilizar es cut.
que trabajado. el error se ha ido.
¿me puede mostrar cómo se hace mediante corte?
La respuesta depende de ¿Qué resultado quieres? a) sólo en un entero (o NA) b) factor de etiquetas o de hecho, c) una matriz de dicotomizada/ variables ficticias? findInterval() sólo se puede hacer la primera, mientras que cut() no tanto. findInterval() es más rápido (O(log(n. de contenedores)) a pesar de que rara vez es un problema.

OriginalEl autor leian | 2012-10-19

4 respuestas

  1. 30

    Me gustaría utilizar findInterval() aquí:

    Primero, hacer algunos datos de ejemplo

    set.seed(1)
    ages <- floor(runif(20, min = 20, max = 50))
    ages
    # [1] 27 31 37 47 26 46 48 39 38 21 26 25 40 31 43 34 41 49 31 43

    Uso findInterval() para clasificar la “edad” del vector.

    findInterval(ages, c(20, 30, 40))
    # [1] 1 2 2 3 1 3 3 2 2 1 1 1 3 2 3 2 3 3 2 3

    Alternativamente, como se recomienda en los comentarios, cut() también es útil aquí:

    cut(ages, breaks=c(20, 30, 40, 50), right = FALSE)
    cut(ages, breaks=c(20, 30, 40, 50), right = FALSE, labels = FALSE)
    Señor, se que comando proporcionar la misma agrupación?
    has probado el código? debe. Sin embargo, al hacer preguntas aquí en el R de la etiqueta, LO que, lo mejor es incluir un mínimo de reproducible ejemplo si desea más específico.
    ah.. que trabajó. y que un sencillo código.
    pero ¿cuál será el nombre de la variable el resultado de este findInterval()?
    Lo que quieras ser! A partir de su ejemplo, supongo que deberías hacer algo como data$agegrp <- findInterval(data$age, c(20, 30, 40)).

    OriginalEl autor A5C1D2H2I1M1N2O1R2T1

  2. 7

    Esta respuesta tiene dos formas de resolver el problema utilizando la data.table paquete, que mejoraría en gran medida la velocidad del proceso. Esto es crucial si se trabaja con grandes conjuntos de datos.

    1s Enfoque: una adaptación de la respuesta anterior, pero ahora utilizando data.table + incluyendo labels:

    library(data.table)
    agebreaks <- c(0,1,5,10,15,20,25,30,35,40,45,50,55,60,65,70,75,80,85,500)
    agelabels <- c("0-1","1-4","5-9","10-14","15-19","20-24","25-29","30-34",
    "35-39","40-44","45-49","50-54","55-59","60-64","65-69",
    "70-74","75-79","80-84","85+")
    setDT(data)[ , agegroups := cut(age, 
    breaks = agebreaks, 
    right = FALSE, 
    labels = agelabels)]

    2º Enfoque: Esta es una de las más prolijo método, sino que también hace que sea más claro qué es exactamente cae dentro de cada grupo de edad:

    setDT(data)[age <1, agegroup := "0-1"]
    data[age >0 & age <5, agegroup := "1-4"]
    data[age >4 & age <10, agegroup := "5-9"]
    data[age >9 & age <15, agegroup := "10-14"]
    data[age >14 & age <20, agegroup := "15-19"]
    data[age >19 & age <25, agegroup := "20-24"]
    data[age >24 & age <30, agegroup := "25-29"]
    data[age >29 & age <35, agegroup := "30-34"]
    data[age >34 & age <40, agegroup := "35-39"]
    data[age >39 & age <45, agegroup := "40-44"]
    data[age >44 & age <50, agegroup := "45-49"]
    data[age >49 & age <55, agegroup := "50-54"]
    data[age >54 & age <60, agegroup := "55-59"]
    data[age >59 & age <65, agegroup := "60-64"]
    data[age >64 & age <70, agegroup := "65-69"]
    data[age >69 & age <75, agegroup := "70-74"]
    data[age >74 & age <80, agegroup := "75-79"]
    data[age >79 & age <85, agegroup := "80-84"]
    data[age >84, agegroup := "85+"]

    Aunque los dos enfoques deben dar el mismo resultado, yo prefiero el 1 de uno por dos razones. (a) es más corto de escribir y (2) los grupos de edad están ordenados en la forma correcta, lo cual es crucial cuando se trata de la visualización de los datos.

    El segundo enfoque no parece funcionar con R 3.2. Da un error no se pudo encontrar la función “:=”
    A mí me funciona. Asegúrese de que la carga de la data.table biblioteca library(data.table) ; y el que se está trabajando con datos.tabla (no un marco de datos) setDT(your_dataframe) # convert your DF into a data.table

    OriginalEl autor rafa.pereira

  3. 0

    Digamos que sus edades estaban almacenados en el dataframe columna etiquetada age. Su dataframe es df, y desea una nueva columna age_grouping que contiene el “cubo” que sus edades caída.

    En este ejemplo, suponga que sus edades oscilaban entre los 0 -> 100, y que quería grupo de ellos cada 10 años. El siguiente código lograr esto mediante el almacenamiento de estos intervalos en una nueva age grouping columna:

    df$age_grouping <- cut(df$age, c(0:100, 10))

    OriginalEl autor Marquistador

  4. 0
    myData$age_grp <- myData$age
    myData$age_grp <- ifelse((myData$age>=10 & myData$age<=18) , 'minnor',myData$age_grp)
    myData$age_grp <- ifelse((myData$age>18 & myData$age<=21) , 'junior',myData$age_grp)
    myData$age_grp <- ifelse((myData$age>21 & myData$age<=25) , 'major_1',myData$age_grp)
    myData$age_grp <- ifelse((myData$age>25 & myData$age<=30) , 'major_2',myData$age_grp)
    myData$age_grp <- ifelse((myData$age>30 & myData$age<=40) , 'major_3',myData$age_grp)
    myData$age_grp <- ifelse((myData$age>40 & myData$age<=55) , 'major_4',myData$age_grp)
    myData$age_grp <- ifelse((myData$age>55) , 'minnor',myData$age_grp)
    myData$age_grp<-as.factor(myData$age_grp)
    summary(myData$age_grp)
    library(dplyr)
    myData <- select(myData, -(age) )

    OriginalEl autor user2458922

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *