根据R中的条件对年龄进行分类

时间:2016-07-20 16:29:00

标签: 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 + sex)组,我想根据以下条件创建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 个答案:

答案 0 :(得分: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 :(得分:0)

上面提到的组织功能是一个好主意。但是,如果相同的年龄重复15年并且改变到与前一个年龄相差大于2的其他年龄,则cumsum函数无法正确定位年龄的位置。我编写了以下函数来解决此问题:< / p>

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

此功能通过警告为我提供所需的输出。警告是&#34;要更换的项目数量不是更换长度的倍数&#34;。现在正在努力摆脱警告,并感谢任何帮助。