R语言 折叠 Package 中的分组方法

qlvxas9a  于 2023-05-11  发布在  其他
关注(0)|答案(2)|浏览(187)

我正在尝试使用collapse package计算分组均值。下面是一个我正在努力实现的例子。

library(data.table)
library(collapse)

data_1 <- as.data.table(airquality)
var_means <- c(
  "Ozone",
  "Solar.R",
  "Wind"
)
data_1[,paste0(var_means,"_mean") := lapply(.SD,mean,na.rm = TRUE),by = .(Month)]
toe95027

toe950271#

至少有几种方法。使用dplyr样式的语法:

library(collapse)

var_means <- c(
  "Ozone",
  "Solar.R",
  "Wind"
)

airquality |>
  fgroup_by(Month) |>
  fmutate(across(var_means, fmean, .names = TRUE)) |>
  fungroup()

或者使用ftransform()

ftransform(airquality,
           fmean(
             list(
               Ozone_mean = Ozone,
               Solar.R_mean = Solar.R,
               Wind_mean = Wind
             ),
             g = Month,
             TRA = 1
           ))

或者,如果你想传递一个列的字符向量,你需要像这样:

ftransform(airquality, 
           fmean(
             do.call(list, lapply(setNames(var_means, paste0(var_means, "_mean")), as.name)),
             g = Month,
             TRA = 1
           ))
r1zk6ea1

r1zk6ea12#

里奇的回答很好。我想补充的是,你可以在列表中传递函数给fmutate:

airquality |>
  fgroup_by(Month) |>
  fmutate(across(var_means, list(mean = fmean), .names = TRUE)) |>
  fungroup()

你也可以使用ftransform与复合管道和add_stub函数:

library(magrittr)
airquality %>% ftransform(get_vars(., var_means) %>% fmean(Month, TRA = 1) %>% 
                          add_stub("_mean", pre = FALSE))

如果不需要重命名列,一个简单的方法是使用settransformv

settransformv(airquality, var_means, fmean, Month, TRA = 1, apply = FALSE)

非常接近你对data.table所做的。这里的apply = FALSE确保我们使用应用于帧的整个子集的fmean.data.frame,因此我们只需要分组一次。
最后一个混合选项是fcomputevadd_vars<-ftransform<-,后者更智能(即如果再次执行,它将替换列),但前者更快。

add_vars(airquality) <- airquality |> 
    fcomputev(var_means, fmean, Month, TRA = 1, apply = FALSE) |> 
    add_stub("_mean", pre = FALSE)

相关问题