R:dplyr和行号()未按预期进行枚举

R:dplyr和行号()未按预期进行枚举,r,dataframe,dplyr,tibble,R,Dataframe,Dplyr,Tibble,我想枚举分组产生的dataframe/Tible的每条记录。索引是按照定义的顺序进行的。如果我使用row_number(),它会在组内枚举。但我希望它在不考虑前一个分组的情况下进行枚举 这里有一个例子。为了简单起见,我使用了最简单的数据帧: library(dplyr) df0 <- data.frame( x1 = rep(LETTERS[1:2],each=2) , x2 = rep(letters[1:2], 2)

我想枚举分组产生的dataframe/Tible的每条记录。索引是按照定义的顺序进行的。如果我使用row_number(),它会在组内枚举。但我希望它在不考虑前一个分组的情况下进行枚举

这里有一个例子。为了简单起见,我使用了最简单的数据帧:

library(dplyr)

df0 <- data.frame( x1 = rep(LETTERS[1:2],each=2)
                 , x2 = rep(letters[1:2], 2)
                 , y = floor(abs(rnorm(4)*10))
)
df0
#   x1 x2  y
# 1  A  a 12
# 2  A  b 24
# 3  B  a  0
# 4  B  b 12
库(dplyr)
df0%汇总(y=总和(y))
这给了我一个tibble类的对象:

 # A tibble: 4 x 3
 # Groups:   x1 [?]
 #   x1    x2        y
 #   <fct> <fct> <dbl>
 # 1 A     a        12
 # 2 A     b        24
 # 3 B     a         0
 # 4 B     b        12
#一个tible:4 x 3
#组:x1[?]
#x1x2y
#     
#1 A 12
#2 A b 24
#3BA0
#4 B 12
我想使用row_numer()将行号添加到此表中:

df2%arrange(desc(y))%%>%mutate(index=row_number())
df2
#一个tibble:4x4
#分组:x1[2]
#x1x2y指数
#      
#1 A b 24 1
#2 A 12 2
#3 B 12 1
#4BA02
行数()在前一个分组中不枚举。这不是我的本意。这可以避免首先将TIBLE转换为数据帧:

 df2 <- df2 %>% as.data.frame() %>% arrange(desc(y)) %>% mutate(index = row_number())
 df2
 #   x1 x2  y index
 # 1  A  b 24     1
 # 2  A  a 12     2
 # 3  B  b 12     3
 # 4  B  a  0     4
df2%as.data.frame()%%>%arrange(desc(y))%%>%mutate(index=row_number())
df2
#x1x2y指数
#1 A b 24 1
#2 A 12 2
#3 B 12 3
#4BA04
我的问题是:这种行为是故意的吗? 如果是:将以前的数据处理合并到tibble中不是很危险吗?合并了哪种类型的处理?
目前,我将把TIBLE转换为dataframe,以避免出现这种意外结果。

详细说明我的评论:是的,保留分组是有意的,在许多情况下是有用的。只有当你不了解
groupby
是如何工作的,并且这对任何函数都是正确的,这才是危险的。要通过撤消
group\u,请调用
ungroup

看一下,因为它们非常全面,并解释了此函数如何与其他函数交互,分组是如何分层的,等等。文档还解释了每次调用
summary
时如何删除分组层。您可能对正在发生的事情感到困惑

例如,您可以按
x1
x2
分组,汇总
y
,并创建行号,行号将根据
x1
为您提供行(
summary
删除一层分组,即删除
x2
分组)。然后,解组允许您基于整个数据帧获取行号

库(dplyr)
df0%>%
(x1,x2)%>%
总结(y=总和(y))%>%
变异(组行=行号())%>%
解组()%>%
变异(所有行=行编号())
#>#A tibble:4 x 5
#>x1 x2 y组所有行
#>                
#>1 A 12 1 1
#>2 A b 2 2
#>3BA103
#>4B2324
一个用例——我可能每天都这样做,就是在多个组中求和(同样是,
x1
x2
),然后用
mutate
找到这些值在更大组中的份额(剥去一层分组后,这是
x1
)。同样,这里我取消分组以显示共享,而不是整个数据帧

df0%>%
(x1,x2)%>%
总结(y=总和(y))%>%
突变(组中的份额=y/总和(y))%>%
解组()%>%
突变(共享所有值df=y/总和(y))
#>#A tibble:4 x 5
#>x1 x2 y共享\u在\u组中共享\u所有\u df
#>                       
#>1A 12 0.857 0.255
#>2 A b 2 0.1430.0426
#>3 B 10 0.303 0.213
#>4 B 23 0.697 0.489

由(v0.2.1)于2018年10月11日创建。

mutate(index=row_number())
之前添加
ungroup()%%>%
怎么样?
?是的,该行为是有意的,因为您仍然可以对上一个案例进行分组。您需要先
ungroup()
。尝试<代码> DF1%> %unGROUP()%%Sead(DeCc(y))%.%突变(index = RoWo编号())<代码>或做代码> DF1%GROPY(x1,x2)%> %y(y=和(y))%> %unGROUP()/代码>。更重要的是要知道这就是将要发生的事情,并采取相应的行动,即当你不再需要分组时,调用
ungroup
,我必须深入研究tidyverse。
 df2 <- df1 %>% arrange(desc(y)) %>% mutate(index = row_number())
 df2
 # A tibble: 4 x 4
 # Groups:   x1 [2]
 #   x1    x2        y index
 #   <fct> <fct> <dbl> <int>
 # 1 A     b        24     1
 # 2 A     a        12     2
 # 3 B     b        12     1
 # 4 B     a         0     2
 df2 <- df2 %>% as.data.frame() %>% arrange(desc(y)) %>% mutate(index = row_number())
 df2
 #   x1 x2  y index
 # 1  A  b 24     1
 # 2  A  a 12     2
 # 3  B  b 12     3
 # 4  B  a  0     4