如何使用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索引
fromdplyr
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)
withfactor(x,levels=unique(x))
如果您愿意,但这不是问题的一部分。一般来说,行顺序并不意味着什么,除非先显式排序,否则通常无法保证。如果要创建一个具有因子的因子(而不是像这里那样创建索引),则需要以某种方式指定级别。