首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将数值变量分类为group/ bins/ breaks

将数值变量分类为group/ bins/ breaks
EN

Stack Overflow用户
提问于 2012-10-20 01:34:17
回答 5查看 100.7K关注 0票数 25

我正在尝试将一个数值变量(年龄)按间隔分类,这样它就不会是连续的。我有这样的代码:

代码语言:javascript
复制
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

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

代码语言:javascript
复制
invalid function in complex assignment

你能告诉我错误在哪里吗?data是我使用的数据帧。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2012-10-20 01:40:20

我会在这里使用findInterval()

首先,构造一些样本数据

代码语言:javascript
复制
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()对你的“年龄”向量进行分类。

代码语言:javascript
复制
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()在这里也很有用:

代码语言:javascript
复制
cut(ages, breaks=c(20, 30, 40, 50), right = FALSE)
cut(ages, breaks=c(20, 30, 40, 50), right = FALSE, labels = FALSE)
票数 47
EN

Stack Overflow用户

发布于 2019-12-23 10:28:13

我们可以使用dplyr

代码语言:javascript
复制
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更容易编写和解释。

票数 19
EN

Stack Overflow用户

发布于 2015-08-23 03:40:30

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

1s方法:改编自上一个答案,但现在使用data.table +,包括labels

代码语言:javascript
复制
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)]

method :这是一个更冗长的方法,但它也更清楚地说明了每个年龄段的确切内容:

代码语言:javascript
复制
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)年龄组以正确的方式排序,这在可视化数据时至关重要。

票数 16
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12979456

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档