2016-07-20 14 views
1

大きなデータフレームがあり、条件に応じて同じグループ内の年齢を分類したいと考えています。次に例を示します。条件に応じた年齢の分類R

はの私は、次のデータフレームを持っているとしましょう:各(hhid +性別)グループのために

HHID Sex Age 
    112 1 14 
    112 1 15 
    112 2 17 
    112 2 19 
    113 2 50 
    113 2 51 
    113 2 51 

を、私は、次の条件に基づいてagegrp変数を作成したいと思います。ifが各行の年齢差が2年以上ある場合は、それらを異なるグループに分類します。それ以外の場合は、同じカテゴリに入れてください。ここで私が何をしたいです:

HHID Sex Age Agegrp 
    112 1 14 14 
    112 1 15 14 
    112 2 17 17 
    112 2 19 17 
    113 2 50 50 
    113 2 51 50 
    113 2 51 50 

私が持っているデータセットは、この例に比べて、本当に大きいです。したがって、私は一般的な解決策を探しています。

ありがとうございます。

は、私はそれを実装するためにbase Rdplyrまたはdata.tableを選択し、その後、迅速なorganize機能を記述し

答えて

2

をdilsat。あなたが好む方:

organize <- function(v, threshold=2) v[cumsum(c(TRUE, diff(v) > threshold))] 

#base (no packages) 
df1$Agegrp <- with(df1, ave(Age, HHID, Sex, FUN=organize)) 

#dplyr 
library(dplyr) 
df1 %>% group_by(HHID, Sex) %>% 
    mutate(Agegrp = organize(Age)) 

#data.table 
library(data.table) 
setDT(df1)[, organize(Age), by=.(HHID, Sex)] 
+1

'data.table'と' dplyr'は単一のパッケージ 'dtplyr'に結合されています。ちょっと楽しい事実:) –

+4

著者は 'data.table'バックエンドを' dplyr'に追加しました。 「単一パッケージに結合された」と同じではありません。例えば、githubから "dtplyrは、変わるよりもむしろオブジェクトのコピーを作成するので、常にdata.tableよりも少し遅くなります。" 'data.table'を使いたいなら、実際のパッケージをロードすることをお勧めします。 –

+0

@PierreLafortuneご協力ありがとうございます。出来た! :) – Dilsat

0

整理機能は良いアイデアであることにより、上記の提案します。しかし、同じ年齢を15年間と繰り返し、以前の年齢との差が2歳以上の他の年齢に変更した場合、cumsum関数は年齢の位置を正しく見つけることができません。この問題を解決する関数は次のとおりです。

organize = function(v, threshold=2) v[rep.int(which(c(TRUE, diff(v) > threshold)==TRUE), c(diff(which(c(TRUE, diff(v) > threshold)==TRUE)),1))] 

この機能を使用すると、警告が表示されます。警告は、「交換するアイテムの数は交換長の倍数ではありません」です。今、警告や助けを取り除くことに取り組んでいます。

関連する問題