您的位置:

深入剖析lapply函数

一、lapply的定义

lapply是R语言中的一个常用函数,其全称为“list apply”,即对于一个列表型对象的每一元素应用一个特定的函数,返回一个由这些函数的返回值组成的列表对象。同时,lapply也支持其他的对象类型,如向量和数据框。

其基本语法如下:

lapply(X, FUN, …)

X表示列表型对象,FUN表示需要应用的函数,…代表FUN所需要的参数

二、lapply的使用

使用lapply时,需要先有一个列表型对象,下面我们通过示例代码来说明:

#创建列表型对象
my_list <- list(1:5, letters[1:10])

#定义函数
my_fun <- function(x) {
  paste(x, "hello", sep = ", ")
}

#通过lapply对my_list中每个元素应用my_fun函数
lapply(my_list, my_fun)

运行结果如下:

[[1]]
[1] "1 hello, 2 hello, 3 hello, 4 hello, 5 hello"

[[2]]
[1] "a hello, b hello, c hello, d hello, e hello, f hello, g hello, h hello, i hello, j hello"

可以看到,lapply返回了一个列表对象,其中每个元素都是由my_fun函数返回的结果。这个结果和my_list对象的结构一样,是一个由两个元素组成的列表。

三、lapply的特点

1、自动化迭代

lapply是一个高度封装的函数,它对于迭代的过程进行了自动化处理,用户只需要提供一个列表对象和一个需要应用的函数,就可以轻松地将这个函数应用到列表的每个元素上。

例如下面的代码:

#创建数字型向量和字符型向量
my_num <- 1:10
my_char <- letters[1:10]

#定义平方函数和转换为大写字母的函数
my_square <- function(x) {
  x^2
}
my_upper <- function(x) {
  toupper(x)
}

#通过lapply对my_num和my_char中的每个元素应用函数
lapply(my_num, my_square)
lapply(my_char, my_upper)

运行结果如下:

[[1]]
[1] 1

[[2]]
[1] 4

[[3]]
[1] 9

[[4]]
[1] 16

[[5]]
[1] 25

[[6]]
[1] 36

[[7]]
[1] 49

[[8]]
[1] 64

[[9]]
[1] 81

[[10]]
[1] 100

[[1]]
[1] "A"

[[2]]
[1] "B"

[[3]]
[1] "C"

[[4]]
[1] "D"

[[5]]
[1] "E"

[[6]]
[1] "F"

[[7]]
[1] "G"

[[8]]
[1] "H"

[[9]]
[1] "I"

[[10]]
[1] "J"

可以看到,lapply自动对列表的每个元素进行了迭代,并将函数应用到每个元素上,返回了一个新的列表。此时每个元素都已经被处理完毕了。

2、结果是一个列表对象

lapply的返回结果是一个由函数处理结果组成的列表对象。这个列表对象的长度等于X的长度,每个元素是一个独立的处理结果。

例如下面的代码:

#创建一个数据框
my_df <- data.frame(name = c("Jack", "Peter", "Mary"),
                   age = c(26, 30, 24),
                   gender = c("M", "M", "F"))

#定义函数
my_fun <- function(x) {
  paste("Name:", x$name, "Age:", x$age, "Gender:", x$gender, sep = " ")
}

#通过lapply对my_df每行应用my_fun函数
lapply(1:nrow(my_df), function(x) {
  my_fun(my_df[x, ])
})

运行结果如下:

[[1]]
[1] "Name:Jack Age:26 Gender:M"

[[2]]
[1] "Name:Peter Age:30 Gender:M"

[[3]]
[1] "Name:Mary Age:24 Gender:F"

可以看到,lapply返回了一个列表对象,其中每个元素都是由my_fun函数在my_df数据框的每行都应用一次得到的结果。

四、lapply与其他apply函数的比较

1、apply

apply函数是R语言中非常经典的函数之一,它可以应用到任何数组型对象中,包括向量、矩阵和数据框等。而lapply只能应用到列表、向量和数据框等具有特定结构的对象中。

#创建矩阵型对象
my_mat <- matrix(1:12, nrow = 3)

#通过apply函数对矩阵中每行的元素进行求和
apply(my_mat, 1, sum)

#通过lapply函数对my_list中的每个元素应用sum函数
lapply(my_list, sum)

可以看到,通过apply函数可以对矩阵的每行应用sum函数得到其和,通过lapply函数只能对向量中的元素、列表中的元素、数据框中的列应用函数得到特定的结果。

2、sapply、vapply和mapply

sapply、vapply和mapply都是lapply的改进版本,具有更好的灵活性和更方便的使用方式。

sapply:

sapply基于lapply,并且自动处理返回结果的转换。它会根据返回结果的类型,自动把返回结果转换为简单的类型(向量、矩阵或列表),可以省去转换的步骤。

#创建列表型对象
my_list <- list(1:5, letters[1:10])

#定义函数
my_fun <- function(x) {
  paste(x, "hello", sep = ", ")
}

#通过sapply对my_list中每个元素应用my_fun函数
sapply(my_list, my_fun)

可以看到,sapply可以自动将返回结果转换为简单的类型,这里转换成了一个矩阵。

     [,1]                 [,2]                            
[1,] "1 hello"            "a hello"                        
[2,] "2 hello"            "b hello"                        
[3,] "3 hello"            "c hello"                        
[4,] "4 hello"            "d hello"                        
[5,] "5 hello"            "e hello"                        
[6,] NA                      "f hello"                        
[7,] NA                      "g hello"                        
[8,] NA                      "h hello"                        
[9,] NA                      "i hello"                        
[10,] NA                      "j hello"

vapply:

vapply函数比sapply更为安全,因为它可以指定返回结果的类型和长度,避免返回结果出现不一致的情况。

mapply:

mapply函数适用于多列表模式下的应用,即在列表中应用多个具有相同结构的函数,或在多个列表中应用一个具有多参数的函数。

五、总结

lapply函数是R中一个非常常用且重要的函数。它为我们提供了一种高效、便捷的方式,对列表、向量和数据框等对象的每个元素应用相同的函数。在实际应用中,lapply可以帮助我们快速地进行数据处理和分析,提高工作效率。