R:dplyr和row_number()不能按预期枚举

时间:2018-10-11 14:13:10

标签: r dataframe dplyr tibble

我想枚举分组产生的数据帧/标记的每个记录。该索引是按定义的顺序排列的。如果我使用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

现在,我将此表分组:

 df1 <- df0 %>% group_by(x1,x2) %>% summarize(y=sum(y))

这给了我一个小类对象:

 # 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

我想使用row_numer()向该表添加行号:

 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

row_number()确实在前面的分组中枚举。这不是我的意图。这样可以避免先将小标题转换为数据帧:

 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

我的问题是:这种行为是故意的吗? 如果是,将以前的数据处理并入小标题不是很危险吗?合并了哪种类型的处理? 此刻,我将把tibble转换为数据帧,以避免这种意外的结果。

1 个答案:

答案 0 :(得分:4)

详细说明一下:是的,保留分组是有目的的,在许多情况下很有用。仅当您不了解group_by的工作方式时,这才是危险的-任何函数都是如此。要撤消group_by,请致电ungroup

看看group_by docs,因为它们非常详尽,并解释了该功能如何与其他人交互,如何分层等。文档还解释了对summarise的每次调用如何删除一层分组-您可能对那里发生的事情感到困惑。

例如,您可以按x1x2分组,总结y,然后创建一个行号,该行号将根据x1({ {1}}删除了一层分组,即删除了summarise分组)。然后,通过取消分组,您可以基于整个数据帧获取行号。

x2

一个用例(我可能每天都在工作)是获取多个组中的总和(再次,library(dplyr) df0 %>% group_by(x1, x2) %>% summarise(y = sum(y)) %>% mutate(group_row = row_number()) %>% ungroup() %>% mutate(all_df_row = row_number()) #> # A tibble: 4 x 5 #> x1 x2 y group_row all_df_row #> <fct> <fct> <dbl> <int> <int> #> 1 A a 12 1 1 #> 2 A b 2 2 2 #> 3 B a 10 1 3 #> 4 B b 23 2 4 x1),然后在较大的值中找到这些值的份额使用x2分组(在剥离了一层分组后,这是x1)。再次,在这里我取消分组以显示份额而不是整个数据框。

mutate

reprex package(v0.2.1)于2018-10-11创建