代码之家  ›  专栏  ›  技术社区  ›  Rafael Velásquez

如果数字介于某些值之间,则使用dplyr创建组id列[duplicate]

  •  0
  • Rafael Velásquez  · 技术社区  · 7 年前

    我试着把年龄分为几类,这样就不会是连续的了。我有这个代码:

    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
    

    上面的代码在生存包下不起作用。它给了我:

    invalid function in complex assignment
    

    data 是我正在使用的数据帧。

    0 回复  |  直到 7 年前
        1
  •  40
  •   Scransom    9 年前

    我会用 findInterval() 在这里:

    首先,编一些样本数据

    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
    

    findInterval() 对你的“年龄”向量进行分类。

    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
    

    或者,按照评论中的建议, cut()

    cut(ages, breaks=c(20, 30, 40, 50), right = FALSE)
    cut(ages, breaks=c(20, 30, 40, 50), right = FALSE, labels = FALSE)
    
        2
  •  12
  •   ErrantBard rafa.pereira    9 年前

    data.table 包,这将大大提高进程的速度。如果要处理大型数据集,这一点至关重要。

    1s方法 数据表 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)]
    

    第二种方法 :这是一种更为冗长的方法,但它也使每个年龄组的确切情况更加清楚:

    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+"]
    

    虽然这两种方法的结果应该是一样的,但我更喜欢第一种方法,原因有二。(a) 书写的时间更短,(2)年龄组的顺序是正确的,这对于可视化数据至关重要。

        3
  •  8
  •   mnm TYL    6 年前

    dplyr :

    library(dplyr)
    
    data <- data %>% mutate(agegroup = case_when(age >= 40  & age <= 49 ~ '3',
                                                 age >= 30  & age <= 39 ~ '2',
                                                 age >= 20  & age <= 29 ~ '1')) # end function
    

    与其他方法相比, dplyr公司

        4
  •  2
  •   Marquistador    8 年前

    假设您的年龄存储在dataframe列中 age df ,你想要一个新的专栏 age_grouping

    age grouping 列:

    df$age_grouping <- cut(df$age, c(0:100, 10))
    
        5
  •  1
  •   user2458922 Maria    8 年前
    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) )