gpt4 book ai didi

R:对数据帧的子集快速执行操作,然后在没有内部函数的情况下重新聚合结果

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

我们有一个非常大的数据框 df ,可以按因子拆分。在此拆分创建的数据帧的每个子集上,我们需要执行一个操作来增加该子集的行数,直到它成为某个 length 。之后,我们对子集进行 rbind 以获得更大版本的 df

有没有办法在不使用内部函数的情况下快速做到这一点?

假设我们的子集操作(在单独的 .R 文件中)是:
foo <- function(df) { magic }
我们想出了几种方法来做到这一点:

1)

df <- split(df, factor)
df <- lapply(df, foo)
rbindlist(df)

2)
assign('list.df', list(), envir=.GlobalEnv) 
assign('i', 1, envir=.GlobalEnv)

dplyr::group_by(df, factor)
dplyr::mutate(df, foo.list(df.col))
df <- rbindlist(list.df)
rm('list.df', envir=.GlobalEnv)
rm('i', envir=.GlobalEnv)

(In a separate file)
foo.list <- function(df.cols) {
magic;
list.df[[i]] <<- magic.df
i <<- i + 1
return(dummy)
}

第一种方法的问题是时间。 lapply 只是需要太长时间才能真正令人满意(对于我们的数据集大约一个小时)。

第二种方法的问题是篡改用户全局环境的极其不受欢迎的副作用。它明显更快,但如果可以,我们宁愿避免这种情况。

我们还尝试传入列表和计数变量,然后尝试使用父环境中的变量对它们进行 substitute(一种解决 R 缺少传递引用的技巧)。

我们已经查看了许多可能相关的 SO 问题( R applying a function to a subset of a data frameCalculations on subsets of a data frameR: Pass by reference 等),但没有一个能很好地解决我们的问题。

如果您想运行代码,您可以复制和粘贴以下内容:
 x <- runif(n=10, min=0, max=3)
y <- sample(x=10, replace=FALSE)
factors <- runif(n=10, min=0, max=2)
factors <- floor(factors)
df <- data.frame(factors, x, y)

df 现在看起来像这样(长度 10):
Original df
 ## We group by factor, then run foo on the groups.

foo <- function(df.subset) {
min <- min(df.subset$y)
max <- max(df.subset$y)

## We fill out df.subset to have everything between the min and
## max values of y. Then we assign the old values of df.subset
## to the corresponding spots.

df.fill <- data.frame(x=rep(0, max-min+1),
y=min:max,
factors=rep(df.subset$factors[1], max-min+1))
df.fill$x[which(df.subset$y %in%(min:max))] <- df.subset$x
df.fill
}

所以我可以在第一种方法中使用我的示例代码来构建一个新的 df(长度为 18):
New df

最佳答案

由于快速的功能,使用 data.table 这不会花费很长时间。如果可以,请重写您的函数以使用特定变量。 split-apply-combine 处理可能会获得性能提升:

library(data.table)
system.time(
df2 <- setDT(df)[,foo(df), factors]
)
# user system elapsed
# 1.63 0.39 2.03

关于R:对数据帧的子集快速执行操作,然后在没有内部函数的情况下重新聚合结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35064315/

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