我有一个大数据框,我想根据条件对同一组内的年龄进行分类。这是一个例子:
假设我有以下数据框:
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
答案 0 :(得分:2)
我会写一个快速的organize
函数,然后选择base R
,dplyr
或data.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;。现在正在努力摆脱警告,并感谢任何帮助。