[英]Assign a group number based on another column by group in R
这可能非常简单,但我无法想出办法。 我有一些看起来像这样的数据:
domain difference
xxxx 0
xxxx 2
xxxx 14
xxxx 3
xxxx 7
xxxx 2
yyyy 6
yyyy 5
yyyy 13
yyyy 10
zzzz 2
zzzz 5
zzzz 1
zzzz 15
zzzz 16
zzzz 8
zzzz 9
我希望它看起来像这样:
domain difference grp
xxxx 0 1
xxxx 2 1
xxxx 14 2
xxxx 3 2
xxxx 7 2
xxxx 2 2
yyyy 6 1
yyyy 5 1
yyyy 13 1
yyyy 10 1
zzzz 2 1
zzzz 5 1
zzzz 1 1
zzzz 15 2
zzzz 16 3
zzzz 8 3
zzzz 9 3
因此,基本上通过域我想要将组编号分配给多行,如果差异大于或等于14.当存在大于或等于14的差异时,将组编号分配给前面的行。
我已经尝试过使用嵌套for循环,其中域是级别但我觉得这可能是不必要的复杂,我不知道如何告诉循环继续前进并在分配第一个后继续它停止的地方组号。 这是我到目前为止所拥有的:
lev <- levels(e_won$domain)
lev <- levels(e_won$domain)
for (i in 1:length(lev)) {
for (j in 1:nrow(lev)){
if (difference[j] >= 14) {
grp[1:j] = 1
}
我对非循环解决方案完全开放,但这正是我最初的想法。
你可以试试
library(data.table)
setDT(df1)[, grp:=cumsum(difference>=14)+1L, by=domain][]
# domain difference grp
#1: xxxx 0 1
#2: xxxx 2 1
#3: xxxx 14 2
#4: xxxx 3 2
#5: xxxx 7 2
#6: xxxx 2 2
#7: yyyy 6 1
#8: yyyy 5 1
#9: yyyy 13 1
#10: yyyy 10 1
#11: zzzz 2 1
#12: zzzz 5 1
#13: zzzz 1 1
#14: zzzz 15 2
#15: zzzz 16 3
#16: zzzz 8 3
#17: zzzz 9 3
或者使用dplyr
df1 %>%
group_by(domain) %>%
mutate(grp= cumsum(difference >=14)+1L)
或使用base R
(来自@Colonel Beauvel的评论)
df1$grp <- with(df1, ave(difference>=14, domain, FUN=cumsum)) + 1L
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.