在R中按组分配基于另一列的组号
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
这可能非常简单,但我想不出办法。我有一些数据如下所示:
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