这可能非常简单,但我无法找到实现这一目标的方法。我有一些看起来像这样的数据:
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
}
我完全接受非循环解决方案,但这正是我最初的想法。
答案 0 :(得分:3)
你可以尝试
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