如何使用dplyr::group_by为数据帧的每组指定数字?

如何使用dplyr::group_by为数据帧的每组指定数字?,r,group-by,functional-programming,dplyr,R,Group By,Functional Programming,Dplyr,我想给数据帧中的每个组编号。例如,我有以下数据帧: df = data.frame( from = c('a', 'a', 'b'), dest = c('b', 'c', 'd') ) #> df #from dest #1 a b #2 a c #3 b d 我想根据from值进行分组,并为每组指定一个组号。这是预期的结果: result = data.frame( from = c('a', 'a', 'b'), dest = c('b'

我想给数据帧中的每个组编号。例如,我有以下数据帧:

df = data.frame( from = c('a', 'a', 'b'), dest = c('b', 'c', 'd') )
#> df
    #from dest
#1    a    b
#2    a    c
#3    b    d
我想根据
from
值进行分组,并为每组指定一个组号。这是预期的结果:

result = data.frame( from = c('a', 'a', 'b'), dest = c('b', 'c', 'd'), group_no = c(1,1,2) )
#> result
    #from dest group_no
#1    a    b        1
#2    a    c        1
#3    b    d        2
我可以使用for循环解决此问题,如下所示:

groups = df$from %>% unique
i = 0
df$group_no = NA
for ( g in groups ) {
    i = i + 1
    df[ df$from == g, ]$group_no = i
}
#> df
    #from dest group_no
#1    a    b        1
#2    a    c        1
#3    b    d        2

我想知道是否有可能在不使用for循环的情况下以一种更优雅、更实用的方式解决这个问题?具体地说,我想知道是否可以使用
dplyr::group_by
函数来实现这一点。

您可以尝试从基本包中进行
转换

transform(df,group_no=as.numeric(factor(from)))

#   from dest group_no
#1    a    b  1
#2    a    c  1
#3    b    d  2
如果
from
列已经是一个因子,则可以删除
factor()
函数并仅使用

transform(df,id=as.numeric(from))

使用
mutate
添加一列,该列仅为
from
的数值形式,作为一个因子:

df %>% mutate(group_no = as.integer(factor(from)))

#   from dest group_no
# 1    a    b        1
# 2    a    c        1
# 3    b    d        2

注:此处不需要“分组依据”
,除非您将其用于其他目的。如果要按新列分组以供以后使用,可以使用
groupby
而不是
mutate
来添加列。

我们可以使用
groupu索引
from
dplyr

library(dplyr)
df %>% 
   mutate(group_no = group_indices_(., .dots="from"))
#     from dest group_no
#1    a    b        1
#2    a    c        1
#3    b    d        2

使用
data.table
的类似选项如下

library(data.table)
setDT(df)[, group_no := .GRP, by = from]

根本不需要使用group_by。DF%%%突变(GROPUNO=AS。整数(from))OP走向错误的方向。编辑提到,当您评论……而不是<代码>因子()/代码>时,考虑使用<代码> fCTyIn Orthor()/<代码>或另一个<代码> FCTA<<代码>函数来指定因子顺序。code>fct_inoorder()保持数据帧的原始顺序,而factor选择的是按顺序排列的因子(也许是字母顺序),您可以按照向量的顺序创建组,如
forcats::fct_inoorder(x)
with
factor(x,levels=unique(x))
如果您愿意,但这不是问题的一部分。一般来说,行顺序并不意味着什么,除非先显式排序,否则通常无法保证。如果要创建一个具有因子的因子(而不是像这里那样创建索引),则需要以某种方式指定级别。