将函数应用于数据框:lapply 与传统方式

Applying a Function to a Data Frame : lapply vs traditional way

我在 R 中有这个数据框:

x <- seq(1, 10,0.1)
y <- seq(1, 10,0.1)
data_frame <- expand.grid(x,y)

我也有这个功能:

some_function <- function(x,y) { return(x+y) }

基本上,我想在基于“some_function”的数据框中创建一个新列。我以为我可以用 R:

中的“lapply”函数来做到这一点
data_frame$new_column <-lapply(c(data_frame$x, data_frame$y),some_function)

这不起作用:

Error in `$<-.data.frame`(`*tmp*`, f, value = list()) : 
  replacement has 0 rows, data has 8281

我知道如何以更“笨拙和传统”的方式做到这一点:

data_frame$new_column = x + y

但我想知道如何使用“lapply”来做到这一点 - 将来,我会有更复杂和更长的函数,像我上面那样写出来会很痛苦。有人可以告诉我如何使用“lapply”吗?

谢谢!

data.frame 中工作时,您可以使用 apply 而不是 lapply:

x <- seq(1, 10,0.1)
y <- seq(1, 10,0.1)
data_frame <- expand.grid(x,y)
head(data_frame)
some_function <- function(x,y) { return(x+y) }

data_frame$new_column <- apply(data_frame, 1, \(x) some_function(x["Var1"], x["Var2"]))
head(data_frame)

将函数应用于行集 MAR = 1,将函数应用于列集 MAR = 2

lapply,顾名思义,就是一个list-apply。由于 data.frame 是一个列列表,您可以使用它来计算列,但在矩形数据中,apply 通常是最简单的。

如果 some_function 是为特定目的而写的,它可以被写成接受 data.frame 的单行,如

x <- seq(1, 10,0.1)
y <- seq(1, 10,0.1)
data_frame <- expand.grid(x,y)
head(data_frame)

some_function <- function(row) { return(row[1]+row[2]) }

data_frame$yet_another <- apply(data_frame, 1, some_function)
head(data_frame)

最后评论: 通常只为一对值编写的函数会以完美矢量化的形式出现。调用 some_function 的最佳方式可能是没有任何 apply 家族的功能,如

some_function <- function(x,y) { return(x + y) }
data_frame$last_one <- some_function(data_frame$Var1, data_frame$Var2)