list 操作重要的函数
我们知道R中比较复杂的数据结构为list,它可以构造出很多我们想要的数据格式,今天我们结合函数…
的操作,讲解一下对一个长度不定的list如何便捷的操作。
以前提过可参考:(这里直接copy)
1.捕获省略号中的内容
先看一个例子:构造一个函数然后对所有的参数进行相加求和。
addemup <- function(x, ...){
args <- list(...)# 推荐把省略号的内容分配给list,然后在对该list进行操作
for (a in args){
x <- x + a
}
x
}
addemup(1,1)
#> [1] 2
addemup(1,2,3,4,5)
#> [1] 15
我们还可以通过..1
,..2
到..9
等直接引用列表…
中的内容。..1
表示第一项,..2
表示第二项,以此类推。
对list操作可以结合purrr包中的map, reduce, accumulate和基础函数do.call等 操作更方便。一个实际的例子,
DGM_U = function(...){
####### 第一部分是对参数的检查 #####################
# 输入的参数为U_{k},U_{k}代表一个完整的区间乘积互反判断矩阵。
n = nrow(..1)
m = ncol(..1)
args <- list(...)
stopifnot( length(args) >=2, all( map_lgl(args,is.matrix)),2*n ==m )
# 检查所有的矩阵维度是否一样
library(purrr)
t = map(args,dim) %>% do.call(rbind, .)
stopifnot( nrow(unique(t)) == 1)
####### 第二部分 对参数的操作,达到想要的目的###########
## 1. 使用快捷的函数
k = 1 / length(args)
UB = reduce( map(args,function(x)fenjie(x)$B),`*`)^k
UD = reduce( map(args, function(x)fenjie(x)$D), `*`)^k
## 2. 使用循环操作
# UB = matrix(1,nrow = n, ncol = n)
# UD = matrix(1,nrow = n, ncol = n)
# for(xx in args){
# B = fenjie(xx)$B
# D = fenjie(xx)$D
# for(i in 1:n){
# for(j in 1:n){
# UB[i,j] = UB[i,j] * B[i,j]
# UD[i,j] = UD[i,j] * D[i,j]
# }
# }
# }
# k = 1 / length(args)
# UB = UB^( k)
# UD = UD^(k)
return( hecheng(UB,UD))
}
DGM_U(U_t1,U_t2,U_t3)
2.map函数
当然R自带也提供类似的Map函数,但是我们这里只讨论purrr::map函数 ,类似的有map2() , pmap()
map(.x, .f, ...)
# 该函数作用是把每一个函数应用在list中的每一个元素上,或者向量中的每一个元素上。
# x为一个list或者向量
# .f 提供的函数
什么叫list中的每一个元素,比如:
l = list(a = 1:3,b=matrix(1:9,nrow =3), d = list(1:9))
l
#> $a
#> [1] 1 2 3
#>
#> $b
#> [,1] [,2] [,3]
#> [1,] 1 4 7
#> [2,] 2 5 8
#> [3,] 3 6 9
#>
#> $d
#> $d[[1]]
#> [1] 1 2 3 4 5 6 7 8 9
该list 中只有3个元素,第一个元素是向量1:3, 第二个元素是矩阵,第三个元素是一个list。我们可以用length()函数求一个list中元素的个数。
注意: 我们在利用函数参数...
包装成list时候,一般输入的...
的内容具有统一的格式.类似上面的情况。
3.reduce 函数和accumulate 函数
这些函数都是对list中每一个元素进行操作的。无论这个元素的数据结构是什么,该元素可以是数值型向量,字符型向量、矩阵、数据框、list,这些都可以。
4. do.call函数
操作对象也是list中的每一个元素,该函数有点类似于reduce,eg: 把list中的元素转变为matrix
l = list(a= 1:3,b = 4:6,d = 7:9)
reduce(l,rbind) # purrr包中的函数
do.call(rbind,l)
reduce(l,cbind)
do.call(cbind,l)
5. 把正常数据(数据框)转变为list
常常结合split函数进行使用, 首先给一个数据框,按照某种准则划分为一个list,最后利用purrr包中的函数对list中的每一个元素进行处理,
## 以下分类建立一个线性回归模型
library(dplyr)
library(tidyr)
library(purrr)
## 方法1:
mod_fun <- function(df) lm(Sepal.Length ~ ., data = df)
n_iris = iris %>% group_by(Species) %>% nest()
n_iris %>% mutate(model = map(data, mod_fun))
#> # A tibble: 3 x 3
#> # Groups: Species [3]
#> Species data model
#> <fct> <list> <list>
#> 1 setosa <tibble [50 × 4]> <lm>
#> 2 versicolor <tibble [50 × 4]> <lm>
#> 3 virginica <tibble [50 × 4]> <lm>
n_iris
#> # A tibble: 3 x 2
#> # Groups: Species [3]
#> Species data
#> <fct> <list>
#> 1 setosa <tibble [50 × 4]>
#> 2 versicolor <tibble [50 × 4]>
#> 3 virginica <tibble [50 × 4]>
# 方法2:
n_iris_1 = split(iris,iris$Species)
n_iris_1 %>% map(., function(df)lm(Sepal.Length ~ ., data = df[,-5] ) )
#> $setosa
#>
#> Call:
#> lm(formula = Sepal.Length ~ ., data = df[, -5])
#>
#> Coefficients:
#> (Intercept) Sepal.Width Petal.Length Petal.Width
#> 2.3519 0.6548 0.2376 0.2521
#>
#>
#> $versicolor
#>
#> Call:
#> lm(formula = Sepal.Length ~ ., data = df[, -5])
#>
#> Coefficients:
#> (Intercept) Sepal.Width Petal.Length Petal.Width
#> 1.8955 0.3869 0.9083 -0.6792
#>
#>
#> $virginica
#>
#> Call:
#> lm(formula = Sepal.Length ~ ., data = df[, -5])
#>
#> Coefficients:
#> (Intercept) Sepal.Width Petal.Length Petal.Width
#> 0.6999 0.3303 0.9455 -0.1698
n_iris_1
#> $setosa
#> Sepal.Length Sepal.Width Petal.Length Petal.Width Species
#> 1 5.1 3.5 1.4 0.2 setosa
#> 2 4.9 3.0 1.4 0.2 setosa
#> 3 4.7 3.2 1.3 0.2 setosa
#> 4 4.6 3.1 1.5 0.2 setosa
#> 5 5.0 3.6 1.4 0.2 setosa
#> 6 5.4 3.9 1.7 0.4 setosa
#> 7 4.6 3.4 1.4 0.3 setosa
#> 8 5.0 3.4 1.5 0.2 setosa
#> 9 4.4 2.9 1.4 0.2 setosa
#> 10 4.9 3.1 1.5 0.1 setosa
#> 11 5.4 3.7 1.5 0.2 setosa
#> 12 4.8 3.4 1.6 0.2 setosa
#> 13 4.8 3.0 1.4 0.1 setosa
#> 14 4.3 3.0 1.1 0.1 setosa
#> 15 5.8 4.0 1.2 0.2 setosa
#> 16 5.7 4.4 1.5 0.4 setosa
#> 17 5.4 3.9 1.3 0.4 setosa
#> 18 5.1 3.5 1.4 0.3 setosa
#> 19 5.7 3.8 1.7 0.3 setosa
#> 20 5.1 3.8 1.5 0.3 setosa
#> 21 5.4 3.4 1.7 0.2 setosa
#> 22 5.1 3.7 1.5 0.4 setosa
#> 23 4.6 3.6 1.0 0.2 setosa
#> 24 5.1 3.3 1.7 0.5 setosa
#> 25 4.8 3.4 1.9 0.2 setosa
#> 26 5.0 3.0 1.6 0.2 setosa
#> 27 5.0 3.4 1.6 0.4 setosa
#> 28 5.2 3.5 1.5 0.2 setosa
#> 29 5.2 3.4 1.4 0.2 setosa
#> 30 4.7 3.2 1.6 0.2 setosa
#> 31 4.8 3.1 1.6 0.2 setosa
#> 32 5.4 3.4 1.5 0.4 setosa
#> 33 5.2 4.1 1.5 0.1 setosa
#> 34 5.5 4.2 1.4 0.2 setosa
#> 35 4.9 3.1 1.5 0.2 setosa
#> 36 5.0 3.2 1.2 0.2 setosa
#> 37 5.5 3.5 1.3 0.2 setosa
#> 38 4.9 3.6 1.4 0.1 setosa
#> 39 4.4 3.0 1.3 0.2 setosa
#> 40 5.1 3.4 1.5 0.2 setosa
#> 41 5.0 3.5 1.3 0.3 setosa
#> 42 4.5 2.3 1.3 0.3 setosa
#> 43 4.4 3.2 1.3 0.2 setosa
#> 44 5.0 3.5 1.6 0.6 setosa
#> 45 5.1 3.8 1.9 0.4 setosa
#> 46 4.8 3.0 1.4 0.3 setosa
#> 47 5.1 3.8 1.6 0.2 setosa
#> 48 4.6 3.2 1.4 0.2 setosa
#> 49 5.3 3.7 1.5 0.2 setosa
#> 50 5.0 3.3 1.4 0.2 setosa
#>
#> $versicolor
#> Sepal.Length Sepal.Width Petal.Length Petal.Width Species
#> 51 7.0 3.2 4.7 1.4 versicolor
#> 52 6.4 3.2 4.5 1.5 versicolor
#> 53 6.9 3.1 4.9 1.5 versicolor
#> 54 5.5 2.3 4.0 1.3 versicolor
#> 55 6.5 2.8 4.6 1.5 versicolor
#> 56 5.7 2.8 4.5 1.3 versicolor
#> 57 6.3 3.3 4.7 1.6 versicolor
#> 58 4.9 2.4 3.3 1.0 versicolor
#> 59 6.6 2.9 4.6 1.3 versicolor
#> 60 5.2 2.7 3.9 1.4 versicolor
#> 61 5.0 2.0 3.5 1.0 versicolor
#> 62 5.9 3.0 4.2 1.5 versicolor
#> 63 6.0 2.2 4.0 1.0 versicolor
#> 64 6.1 2.9 4.7 1.4 versicolor
#> 65 5.6 2.9 3.6 1.3 versicolor
#> 66 6.7 3.1 4.4 1.4 versicolor
#> 67 5.6 3.0 4.5 1.5 versicolor
#> 68 5.8 2.7 4.1 1.0 versicolor
#> 69 6.2 2.2 4.5 1.5 versicolor
#> 70 5.6 2.5 3.9 1.1 versicolor
#> 71 5.9 3.2 4.8 1.8 versicolor
#> 72 6.1 2.8 4.0 1.3 versicolor
#> 73 6.3 2.5 4.9 1.5 versicolor
#> 74 6.1 2.8 4.7 1.2 versicolor
#> 75 6.4 2.9 4.3 1.3 versicolor
#> 76 6.6 3.0 4.4 1.4 versicolor
#> 77 6.8 2.8 4.8 1.4 versicolor
#> 78 6.7 3.0 5.0 1.7 versicolor
#> 79 6.0 2.9 4.5 1.5 versicolor
#> 80 5.7 2.6 3.5 1.0 versicolor
#> 81 5.5 2.4 3.8 1.1 versicolor
#> 82 5.5 2.4 3.7 1.0 versicolor
#> 83 5.8 2.7 3.9 1.2 versicolor
#> 84 6.0 2.7 5.1 1.6 versicolor
#> 85 5.4 3.0 4.5 1.5 versicolor
#> 86 6.0 3.4 4.5 1.6 versicolor
#> 87 6.7 3.1 4.7 1.5 versicolor
#> 88 6.3 2.3 4.4 1.3 versicolor
#> 89 5.6 3.0 4.1 1.3 versicolor
#> 90 5.5 2.5 4.0 1.3 versicolor
#> 91 5.5 2.6 4.4 1.2 versicolor
#> 92 6.1 3.0 4.6 1.4 versicolor
#> 93 5.8 2.6 4.0 1.2 versicolor
#> 94 5.0 2.3 3.3 1.0 versicolor
#> 95 5.6 2.7 4.2 1.3 versicolor
#> 96 5.7 3.0 4.2 1.2 versicolor
#> 97 5.7 2.9 4.2 1.3 versicolor
#> 98 6.2 2.9 4.3 1.3 versicolor
#> 99 5.1 2.5 3.0 1.1 versicolor
#> 100 5.7 2.8 4.1 1.3 versicolor
#>
#> $virginica
#> Sepal.Length Sepal.Width Petal.Length Petal.Width Species
#> 101 6.3 3.3 6.0 2.5 virginica
#> 102 5.8 2.7 5.1 1.9 virginica
#> 103 7.1 3.0 5.9 2.1 virginica
#> 104 6.3 2.9 5.6 1.8 virginica
#> 105 6.5 3.0 5.8 2.2 virginica
#> 106 7.6 3.0 6.6 2.1 virginica
#> 107 4.9 2.5 4.5 1.7 virginica
#> 108 7.3 2.9 6.3 1.8 virginica
#> 109 6.7 2.5 5.8 1.8 virginica
#> 110 7.2 3.6 6.1 2.5 virginica
#> 111 6.5 3.2 5.1 2.0 virginica
#> 112 6.4 2.7 5.3 1.9 virginica
#> 113 6.8 3.0 5.5 2.1 virginica
#> 114 5.7 2.5 5.0 2.0 virginica
#> 115 5.8 2.8 5.1 2.4 virginica
#> 116 6.4 3.2 5.3 2.3 virginica
#> 117 6.5 3.0 5.5 1.8 virginica
#> 118 7.7 3.8 6.7 2.2 virginica
#> 119 7.7 2.6 6.9 2.3 virginica
#> 120 6.0 2.2 5.0 1.5 virginica
#> 121 6.9 3.2 5.7 2.3 virginica
#> 122 5.6 2.8 4.9 2.0 virginica
#> 123 7.7 2.8 6.7 2.0 virginica
#> 124 6.3 2.7 4.9 1.8 virginica
#> 125 6.7 3.3 5.7 2.1 virginica
#> 126 7.2 3.2 6.0 1.8 virginica
#> 127 6.2 2.8 4.8 1.8 virginica
#> 128 6.1 3.0 4.9 1.8 virginica
#> 129 6.4 2.8 5.6 2.1 virginica
#> 130 7.2 3.0 5.8 1.6 virginica
#> 131 7.4 2.8 6.1 1.9 virginica
#> 132 7.9 3.8 6.4 2.0 virginica
#> 133 6.4 2.8 5.6 2.2 virginica
#> 134 6.3 2.8 5.1 1.5 virginica
#> 135 6.1 2.6 5.6 1.4 virginica
#> 136 7.7 3.0 6.1 2.3 virginica
#> 137 6.3 3.4 5.6 2.4 virginica
#> 138 6.4 3.1 5.5 1.8 virginica
#> 139 6.0 3.0 4.8 1.8 virginica
#> 140 6.9 3.1 5.4 2.1 virginica
#> 141 6.7 3.1 5.6 2.4 virginica
#> 142 6.9 3.1 5.1 2.3 virginica
#> 143 5.8 2.7 5.1 1.9 virginica
#> 144 6.8 3.2 5.9 2.3 virginica
#> 145 6.7 3.3 5.7 2.5 virginica
#> 146 6.7 3.0 5.2 2.3 virginica
#> 147 6.3 2.5 5.0 1.9 virginica
#> 148 6.5 3.0 5.2 2.0 virginica
#> 149 6.2 3.4 5.4 2.3 virginica
#> 150 5.9 3.0 5.1 1.8 virginica
sessionInfo()
#> R version 4.0.2 (2020-06-22)
#> Platform: x86_64-apple-darwin17.0 (64-bit)
#> Running under: macOS Mojave 10.14.5
#>
#> Matrix products: default
#> BLAS: /Library/Frameworks/R.framework/Versions/4.0/Resources/lib/libRblas.dylib
#> LAPACK: /Library/Frameworks/R.framework/Versions/4.0/Resources/lib/libRlapack.dylib
#>
#> locale:
#> [1] zh_CN.UTF-8/zh_CN.UTF-8/zh_CN.UTF-8/C/zh_CN.UTF-8/zh_CN.UTF-8
#>
#> attached base packages:
#> [1] stats graphics grDevices utils datasets methods base
#>
#> other attached packages:
#> [1] purrr_0.3.4 tidyr_1.1.1 dplyr_1.0.1
#>
#> loaded via a namespace (and not attached):
#> [1] knitr_1.29 magrittr_1.5 tidyselect_1.1.0 R6_2.4.1
#> [5] rlang_0.4.7 fansi_0.4.1 stringr_1.4.0 tools_4.0.2
#> [9] xfun_0.17 utf8_1.1.4 cli_2.0.2 htmltools_0.5.0
#> [13] ellipsis_0.3.1 assertthat_0.2.1 yaml_2.2.1 digest_0.6.25
#> [17] tibble_3.0.3 lifecycle_0.2.0 crayon_1.3.4 bookdown_0.20
#> [21] vctrs_0.3.2 glue_1.4.1 evaluate_0.14 rmarkdown_2.3
#> [25] blogdown_0.20 stringi_1.4.6 compiler_4.0.2 pillar_1.4.6
#> [29] generics_0.0.2 pkgconfig_2.0.3
6. 更多list操作
可以参考purrr包,并且rstudio官网上提供相应的总结表(备忘单)。