29

数値変数 (年齢) を間隔で定義されたグループに分類して、連続しないようにしようとしています。私はこのコードを持っています:

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私が使用しているデータフレームです。

4

5 に答える 5

51

ここで使用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)
于 2012-10-19T17:40:19.900 に答える
16

この回答は、パッケージを使用して問題を解決する2つの方法を提供します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)]

2 番目のアプローチ: これはより冗長な方法ですが、各年齢層に正確に含まれるものがより明確になります。

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

2 つの方法で同じ結果が得られるはずですが、私は 2 つの理由から最初の方法を好みます。(a) 記述が短く、(2) 年齢層が正しい方法で並べられています。これは、データを視覚化する際に重要です。

于 2015-08-22T19:40:30.147 に答える