如何使用行式值作为documr中summarise的一部分,实现与data.table类似的行为?

f0brbegy  于 2023-10-13  发布在  其他
关注(0)|答案(2)|浏览(114)

最好用一个例子来解释这个问题。

library(dplyr)
library(data.table)

df <- data.frame(
  id = c(1,1,2,2),
  x = 1:4
)

假设我们需要得到一个组的平均值,乘以组的值。在data.table中,这是直接和直观的。

> setDT(df)[, .(mean(x) * id), by=id]
   id  V1
1:  1 1.5
2:  2 7.0

但是在dplyr中,有一个警告和行重复。

> df |> group_by(id) |> summarise(mean(x) * id)
`summarise()` has grouped output by 'id'. You can override using the `.groups` argument.
# A tibble: 4 × 2
# Groups:   id [2]
     id `mean(x) * id`
  <dbl>          <dbl>
1     1            1.5
2     1            1.5
3     2            7  
4     2            7  
Warning message:
Returning more (or less) than 1 row per `summarise()` group was deprecated in dplyr 1.1.0.
ℹ Please use `reframe()` instead.

我意识到我可以通过添加一个额外的unique()步骤来消除重复,但我不禁感到dplyr在本例中没有得到应有的使用。

uttx8gqw

uttx8gqw1#

您可以使用cur_group()获取当前组信息。然后从那里提取身份

df |> summarise(mean(x) * cur_group()$id, .by=id)
#   id mean(x) * cur_group()$id
# 1  1                      1.5
# 2  2                      7.0

如果有更多的分组列,

df <- data.frame(alpha = c(7,7,23,23), beta=c(-1,-1,3,3), x = 1:4)

df |> group_by(alpha, beta) |> summarise(mean(x) * cur_group()$alpha)
#  alpha  beta `mean(x) * cur_group()$alpha`
#   <dbl> <dbl>                         <dbl>
# 1     7    -1                          10.5
# 2    23     3                          80.5
df |> group_by(alpha, beta) |> summarise(mean(x) * cur_group()$beta)
#   alpha  beta `mean(x) * cur_group()$beta`
#   <dbl> <dbl>                        <dbl>
# 1     7    -1                         -1.5
# 2    23     3                         10.5
anauzrmj

anauzrmj2#

如果我们想使用分组变量,我们必须使用cur_group_id()

library(dplyr)

df |>
    summarise(v1 = mean(x) * cur_group_id(), .by = id)

  id  v1
1  1 1.5
2  2 7.0

相关问题