将函数应用于数据框: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)
我在 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)