R代码将年龄分类为组/箱/休息

问题描述 投票:11回答:4

我想把年龄分成小组,所以不会连续。我有这个代码:

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是我正在使用的数据帧。

r histogram binning categorization bins
4个回答
30
投票

我会在这里使用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)

7
投票

这个答案提供了两种使用data.table包来解决问题的方法,这将大大提高过程的速度。如果使用大型数据集,这一点至关重要。

1s方法:改编了之前的答案,但现在使用data.table +包括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)年龄组以正确的方式排序,这对于数据的可视化至关重要。


1
投票

假设您的年龄存储在标记为age的数据框列中。你的数据框是df,你想要一个新的列age_grouping包含你的年龄落入的“桶”。

在这个例子中,假设您的年龄范围从0 - > 100,并且您希望每10年对它们进行分组。以下代码将通过将这些间隔存储在新的age grouping列中来实现此目的:

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

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) )
© www.soinside.com 2019 - 2024. All rights reserved.