R:dplyr和行号()未按预期进行枚举
我想枚举分组产生的dataframe/Tible的每条记录。索引是按照定义的顺序进行的。如果我使用row_number(),它会在组内枚举。但我希望它在不考虑前一个分组的情况下进行枚举 这里有一个例子。为了简单起见,我使用了最简单的数据帧: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)
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