gpt4 book ai didi

r - 将函数应用于每一行数据框并返回数据框列表的有效方法

转载 作者:行者123 更新时间:2023-12-05 09:22:47 25 4
gpt4 key购买 nike

我有一个函数,它接受多个参数并返回一个数据框。我还有一个数据框,其中每一行都包含我想传递给我的函数的参数,我想将生成的数据框集存储在列表中。执行此操作的有效方法是什么? (我假设它是一些类似apply 的方法。)

例如,假设您有(无意义的)函数

myfunc<-function(dfRow){
return(data.frame(x=dfRow$x:dfRow$y,y=mean(dfRow$x,dfRow$y)))
}

和数据框

df<-data.frame(x=1:3,y=4:6)
df
x y
1 1 4
2 2 5
3 3 6

你可以跑

myfunc(df[1,])
x y
1 1 1
2 2 1
3 3 1
4 4 1

但是如何为数据框的每一行运行 myfunc 并将结果存储在列表中?我知道如何为此做一个基本的 for 循环,但我正在寻找运行速度更快的东西 - 向量化的东西。

最佳答案

您的“无意义”函数需要对 apply 有一定意义才能工作。对于初学者,您将无法使用 $,因为 apply 会将每一行视为一个基本的命名向量。

牢记这一点,这里是一个重写(连同一个更*mean*ingful 的意思):

myfunc <- function(dfRow) {
data.frame(x = dfRow[1]:dfRow[2], y = mean(c(dfRow[1], dfRow[2])))
}

甚至:

myfunc <- function(dfRow) {
data.frame(x = dfRow["x"]:dfRow["y"], y = mean(c(dfRow["x"], dfRow["y"])))
}

这是我们从 applyMARGIN = 1 中得到的(这是按行应用函数):

apply(df, 1, myfunc)
# [[1]]
# x y
# 1 1 2.5
# 2 2 2.5
# 3 3 2.5
# 4 4 2.5
#
# [[2]]
# x y
# 1 2 3.5
# 2 3 3.5
# 3 4 3.5
# 4 5 3.5
#
# [[3]]
# x y
# 1 3 4.5
# 2 4 4.5
# 3 5 4.5
# 4 6 4.5

此外,不要总是过快地注销for 循环。 apply优化的,但基本上在某处隐藏了一个 for 循环。

以下是一些速度比较:

## Function to use with `apply`
myfunc <- function(dfRow) {
data.frame(x = dfRow["y"]:dfRow["x"], y = mean(c(dfRow["x"], dfRow["y"])))
}

## Function to use with `lapply`
myfunc1<-function(dfRow){
return(data.frame(x=dfRow$x:dfRow$y,y=mean(dfRow$x,dfRow$y)))
}

## Sample data
set.seed(1)
df <- data.frame(x = sample(100, 100, TRUE),
y = sample(100, 100, TRUE))

以下是要评估的函数:

fun1 <- function() apply(df, 1, myfunc)

fun2a <- function() {
listargs <- split(df,1:nrow(df))
}

fun3 <- function() {
out <- vector("list", nrow(df))
for (i in 1:nrow(df)) {
out[[i]] <- data.frame(x = df$x[i]:df$y[i], y = mean(c(df$x[i], df$y[i])))
}
out
}

结果如下:

microbenchmark(fun2(), fun2(), fun3(), times = 20)
# Unit: milliseconds
# expr min lq median uq max neval
# fun1() 39.72704 39.99255 40.84243 43.77641 48.16284 20
# fun2() 74.92324 79.20913 82.15130 83.12488 100.51695 20
# fun3() 48.61772 49.59304 50.16654 56.17891 88.65290 20

关于r - 将函数应用于每一行数据框并返回数据框列表的有效方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24684057/

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