list 操作重要的函数

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官网上提供相应的总结表(备忘单)。


次;