gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 11:24:13 24 4
gpt4 key购买 nike

我想枚举分组产生的数据框/小标题的每条记录。该索引是根据定义的顺序。如果我使用 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))
这给了我一个类 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
我想使用 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() 确实在前一个分组中枚举。这不是我的本意。这可以避免先将 tibble 转换为数据框:
 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 中不是很危险吗?包含哪种类型的处理?
目前我会将 tibble 转换为 dataframe 以避免这种意外结果。

最佳答案

详细说明我的评论:是的,保留分组是有意的,并且在许多情况下很有用。如果您不了解 group_by有效——任何功能都是如此。撤消 group_by ,您调用ungroup .

看看 group_by docs ,因为它们非常详尽,并解释了此函数如何与其他函数交互,分组如何分层等。文档还解释了每次调用 summarise删除了一层分组——你可能对正在发生的事情感到困惑。

例如,您可以按 x1 分组。和 x2 , 总结 y ,并创建一个行号,它将根据 x1 为您提供行(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

一个用例——我可能每天都这样做——是在多个组中获取总和(再次, x1x2),然后在更大的组中找到这些值的份额(在剥离一层之后分组,这是 x1 ) 和 mutate .同样,在这里我取消分组以显示共享而不是整个数据框。

df0 %>%
group_by(x1, x2) %>%
summarise(y = sum(y)) %>%
mutate(share_in_group = y / sum(y)) %>%
ungroup() %>%
mutate(share_all_df = y / sum(y))
#> # A tibble: 4 x 5
#> x1 x2 y share_in_group share_all_df
#> <fct> <fct> <dbl> <dbl> <dbl>
#> 1 A a 12 0.857 0.255
#> 2 A b 2 0.143 0.0426
#> 3 B a 10 0.303 0.213
#> 4 B b 23 0.697 0.489

reprex package 创建于 2018 年 10 月 11 日(v0.2.1)

关于R:dplyr 和 row_number() 未按预期枚举,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52762297/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com