2016-07-20 47 views
1

我有一個很大的數據框,我想根據條件將同一組中的年齡進行分類。這裏有一個例子:根據R中的條件對年齡進行分類

比方說,我有以下的數據幀:

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

對於每一個(hhid +性別)組,我想創建基於以下條件的agegrp變量:如果有每行之間的年齡差異在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 

我這個數據集與本例相比真的很大。因此,我正在尋找一個通用的解決方案。

在此先感謝。

dilsat

回答

2

我會寫一個快速organize功能,然後選擇base Rdplyrdata.table來實現它。無論你喜歡:

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))] 

此函數給我所需的輸出一個警告。警告是「要更換的項目數不是更換長度的倍數」。現在正在努力擺脫警告和任何幫助表示讚賞。

相關問題