R語言進階路上||遇見apply函數(shù)家族

在使用R語言進行數(shù)據(jù)分析時,我們發(fā)現(xiàn)一個重要的部分就是對數(shù)據(jù)的處理和轉化辜贵。真正的統(tǒng)計建模以及數(shù)據(jù)可視化均有相應的函數(shù)來完成——需要我們把數(shù)據(jù)整理(tidy)成所用函數(shù)需要的格式刃麸。

摘自《R語言數(shù)據(jù)科學》

對于非開發(fā)者而言陪捷,所以大部分的數(shù)據(jù)分析師的大部分時間都是在轉化數(shù)據(jù)拾氓。關于數(shù)據(jù)的轉化(或者叫提取摘要)R 也出現(xiàn)了很多針對數(shù)據(jù)轉化的R包:reshape2,tidyverse,magrittr,等等势就。其用途就是從某個矩陣(數(shù)據(jù)框或者列表)中按照某種規(guī)則(函數(shù))來構造一個新的矩陣纸厉,通常的辦法是遍歷行或者列系吭,既然是遍歷當然會用到for或者while循環(huán)了。在Andrew Lim關于R和Python的對比回答中颗品,R是一種面向數(shù)組(array-oriented)的語法肯尺,它更像數(shù)學,方便科學家將數(shù)學公式轉化為R代碼躯枢。而Python是一種通用編程語言则吟,更工程化。在使用R時锄蹂,要盡量用array的方式思考氓仲,避免for循環(huán)(運行效率也是一方面考慮)。不用循環(huán)怎么實現(xiàn)迭代呢得糜?這就需要用到apply函數(shù)族敬扛。它不是一個函數(shù),而是一族功能類似的函數(shù)朝抖。

網(wǎng)上已經(jīng)有大量的關于apply家族的帖子啥箭,寫的都很好。實話實說治宣,我不打算做的比他們還好急侥。只是為了讓自己走進這個家族,了解它們侮邀,為了以后更好地調遣它們缆巧。也許你會說現(xiàn)在有更好的迭代工具purrr包,語法要比apply好懂速度也不差豌拙,是的你說的一點不差陕悬,但是那是另一篇文章的事了。apply函數(shù)簇提供一種計算框架按傅,我們把這個框架記住了捉超,編寫相應的函數(shù)放進去可以循環(huán)地實現(xiàn)我們的目的。編寫處理函數(shù)唯绍,也就是解決問題的核心應該是我們應該關心的拼岳,而不是如何來執(zhí)行這個函數(shù),這個功能交給apply家族(當然還有一些其他的函數(shù))况芒。

apply函數(shù)族是R語言中數(shù)據(jù)處理的一組核心函數(shù)惜纸,通過使用apply函數(shù),我們可以實現(xiàn)對數(shù)據(jù)的循環(huán)、分組耐版、過濾祠够、類型控制等操作。

對于每一個函數(shù)粪牲,我們需要知道的是他的:

  • 功能是什么
  • 輸入是什么
  • 輸出是什么
apply

apply函數(shù)是最常用的代替for循環(huán)的函數(shù)古瓤。apply函數(shù)可以對矩陣、數(shù)據(jù)框腺阳、數(shù)組(二維落君、多維),按行或列進行循環(huán)計算亭引,對子元素進行迭代绎速,并把子元素以參數(shù)傳遞的形式給自定義的FUN函數(shù)中,并以返回計算結果焙蚓。

Description
Returns a vector or array or list of values obtained by applying a function to margins of an array or matrix.
Usage
apply(X, MARGIN, FUN, ...)  

Arguments

X    an array, including a matrix.
MARGIN   # 按行計算或按按列計算朝氓,1表示按行,2表示按列 .記憶:行列行列行列主届,先行后列赵哲。
FUN  the function to be applied: see ‘Details’. In the case of functions like +, %*%, etc., the function name must be backquoted or quoted.
...  optional arguments to FUN.
> ## Compute row and column sums for a matrix:
> x <- cbind(x1 = 3, x2 = c(4:1, 2:5))
> dimnames(x)[[1]] <- letters[1:8]
> head(x)
  x1 x2
a  3  4
b  3  3
c  3  2
d  3  1
e  3  2
f  3  3
> apply(x, 2, mean, trim = .2)
x1 x2 
 3  3 
> col.sums <- apply(x, 2, sum)
> row.sums <- apply(x, 1, sum)
> (stopifnot( apply(x, 2, is.vector)))
NULL
> rbind(cbind(x, Rtot = row.sums), Ctot = c(col.sums, sum(col.sums)))
     x1 x2 Rtot
a     3  4    7
b     3  3    6
c     3  2    5
d     3  1    4
e     3  2    5
f     3  3    6
g     3  4    7
h     3  5    8
Ctot 24 24   48
> ## Sort the columns of a matrix
> apply(x, 2, sort)
     x1 x2
[1,]  3  1
[2,]  3  2
[3,]  3  2
[4,]  3  3
[5,]  3  3
[6,]  3  4
[7,]  3  4
[8,]  3  5
> ## keeping named dimnames
> names(dimnames(x)) <- c("row", "col")
> x3 <- array(x, dim = c(dim(x),3),
+             dimnames = c(dimnames(x), list(C = paste0("cop.",1:3))))
> identical(x,  apply( x,  2,  identity))
[1] TRUE
> identical(x3, apply(x3, 2:3, identity))
[1] TRUE
> ##- function with extra args:
> cave <- function(x, c1, c2) c(mean(x[c1]), mean(x[c2]))
> apply(x, 1, cave,  c1 = "x1", c2 = c("x1","x2"))
      row
         a b   c d   e f   g h
  [1,] 3.0 3 3.0 3 3.0 3 3.0 3
  [2,] 3.5 3 2.5 2 2.5 3 3.5 4
> ma <- matrix(c(1:4, 1, 6:8), nrow = 2)
> ma
     [,1] [,2] [,3] [,4]
[1,]    1    3    1    7
[2,]    2    4    6    8
> apply(ma, 1, table)  #--> a list of length 2
[[1]]

1 3 7 
2 1 1 

[[2]]

2 4 6 8 
1 1 1 1 

> apply(ma, 1, stats::quantile) # 5 x n matrix with rownames
     [,1] [,2]
0%      1  2.0
25%     1  3.5
50%     2  5.0
75%     4  6.5
100%    7  8.0
> stopifnot(dim(ma) == dim(apply(ma, 1:2, sum)))
> ## Example with different lengths for each call
> z <- array(1:24, dim = 2:4)
> zseq <- apply(z, 1:2, function(x) seq_len(max(x)))
> zseq         ## a 2 x 3 matrix
     [,1]       [,2]       [,3]      
[1,] Integer,19 Integer,21 Integer,23
[2,] Integer,20 Integer,22 Integer,24
> typeof(zseq) ## list
[1] "list"
> dim(zseq) ## 2 3
[1] 2 3
> zseq[1,]
[[1]]
 [1]  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19

[[2]]
 [1]  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20 21

[[3]]
 [1]  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20 21 22 23

值得注意的是,apply函數(shù)時可以針對數(shù)組進行計算你的君丁,就是說數(shù)組未必是2維的7愣帷!比如我們對z可以進行這樣的操作:

> z
, , 1

     [,1] [,2] [,3]
[1,]    1    3    5
[2,]    2    4    6

, , 2

     [,1] [,2] [,3]
[1,]    7    9   11
[2,]    8   10   12

, , 3

     [,1] [,2] [,3]
[1,]   13   15   17
[2,]   14   16   18

, , 4

     [,1] [,2] [,3]
[1,]   19   21   23
[2,]   20   22   24

> apply(z, 1, function(x) max(x))
[1] 23 24
> apply(z, 2, function(x) max(x))
[1] 20 22 24
> apply(z, 3, function(x) max(x))
[1]  6 12 18 24
> apply(z, 2:3, function(x) max(x))
     [,1] [,2] [,3] [,4]
[1,]    2    8   14   20
[2,]    4   10   16   22
[3,]    6   12   18   24
> apply(z, 1:3, function(x) max(x))
, , 1

     [,1] [,2] [,3]
[1,]    1    3    5
[2,]    2    4    6

, , 2

     [,1] [,2] [,3]
[1,]    7    9   11
[2,]    8   10   12

, , 3

     [,1] [,2] [,3]
[1,]   13   15   17
[2,]   14   16   18

, , 4

     [,1] [,2] [,3]
[1,]   19   21   23
[2,]   20   22   24

> apply(z, 1:2, function(x) max(x))
     [,1] [,2] [,3]
[1,]   19   21   23
[2,]   20   22   24

對一個矩陣的行列進行過濾

ma <- matrix(c(rnorm(100), 1, 6:8), nrow = 10)
ma
dat<-ma
table(apply(dat,2,function(x) sum(x>0.5) )>2)
table(apply(dat,1,function(x) sum(x>0.5) )>3)
dat=dat[apply(dat,1,function(x) sum(x>.5) )>3,
        apply(dat,2,function(x) sum(x>.5) )>2]

> dim(dat)
[1] 6 8
> dim(ma)
[1] 10 11

按行列求平均值和標準差

> sumfn<- function(x)c(n=sum(!is.na(x)),mean=mean(x),sd=sd(x))
> x=apply(ma, 2, sumfn)
> t(x)
       n        mean        sd
 [1,] 10 -0.81989256 1.0101641
 [2,] 10 -0.02861924 0.6222009
 [3,] 10  0.92534442 0.9118387
 [4,] 10 -0.22463996 0.7247355
 [5,] 10  0.20232703 0.8488190
 [6,] 10 -0.22969541 1.4147416
 [7,] 10 -0.22737983 1.3954562
 [8,] 10 -0.22072175 1.2582542
 [9,] 10  0.84735558 0.7582425
[10,] 10  0.21163342 0.9653582
[11,] 10  1.95826460 3.6227635
lapply

lapply函數(shù)是一個最基礎循環(huán)操作函數(shù)之一绘闷,用來對list橡庞、data.frame數(shù)據(jù)集進行循環(huán),并返回和X長度同樣的list結構作為結果集印蔗,通過lapply的開頭的第一個字母’l’就可以判斷返回結果集的類型扒最。

Usage
lapply(X, FUN, ...)
Arguments
X   a vector (atomic or list) or an `[expression](http://127.0.0.1:22572/help/library/base/help/expression)` object. Other objects (including classed objects) will be coerced by`base::[as.list](http://127.0.0.1:22572/help/library/base/help/as.list)`.
FUN   the function to be applied to each element of `X`: see ‘Details’. In the case of functions like `+`, `%*%`, the function name must be backquoted or quoted.
# Examples
require(stats); require(graphics)
x <- list(a = 1:10, beta = exp(-3:3), logic = c(TRUE,FALSE,FALSE,TRUE))
x
# compute the list mean for each list element
lapply(x, mean)
$`a`
[1] 5.5

$beta
[1] 4.535125

$logic
[1] 0.5

> sapply(x, mean)
       a     beta    logic 
5.500000 4.535125 0.500000 

> # median and quartiles for each list element
> lapply(x, quantile, probs = 1:3/4)
$`a`
 25%  50%  75% 
3.25 5.50 7.75 

$beta
      25%       50%       75% 
0.2516074 1.0000000 5.0536690 

$logic
25% 50% 75% 
0.0 0.5 1.0 

> sapply(x, quantile)
         a        beta logic
0%    1.00  0.04978707   0.0
25%   3.25  0.25160736   0.0
50%   5.50  1.00000000   0.5
75%   7.75  5.05366896   1.0
100% 10.00 20.08553692   1.0

lapply就可以很方便地把list數(shù)據(jù)集進行循環(huán)操作,還可以用data.frame數(shù)據(jù)集按列進行循環(huán)华嘹,但如果傳入的數(shù)據(jù)集是一個向量或矩陣對象吧趣,那么直接使用lapply就不能達到想要的效果了。

> x <- cbind(x1=3, x2=c(2:1,4:5))
> x; class(x)
     x1 x2
[1,]  3  2
[2,]  3  1
[3,]  3  4
[4,]  3  5
[1] "matrix"
> lapply(x, quantile, probs = 1:3/4)
[[1]]
25% 50% 75% 
  3   3   3 

[[2]]
25% 50% 75% 
  3   3   3 

[[3]]
25% 50% 75% 
  3   3   3 

[[4]]
25% 50% 75% 
  3   3   3 

[[5]]
25% 50% 75% 
  2   2   2 

[[6]]
25% 50% 75% 
  1   1   1 

[[7]]
25% 50% 75% 
  4   4   4 

[[8]]
25% 50% 75% 
  5   5   5 

lapply會分別循環(huán)矩陣中的每個值耙厚,而不是按行或按列進行分組計算强挫。

sapply

sapply函數(shù)是一個簡化版的lapply,sapply增加了2個參數(shù)simplify和USE.NAMES薛躬,主要就是讓輸出看起來更友好俯渤,返回值為向量,而不是list對象型宝。

在上面lapply中已經(jīng)演示過了八匠,如果saplly中simplify=FALSE和USE.NAMES=FALSE絮爷,那么完全sapply函數(shù)就等于lapply函數(shù)了。

vapply

vapply類似于sapply梨树,提供了FUN.VALUE參數(shù)坑夯,用來控制返回值的行名,這樣可以讓程序更健壯劝萤≡ɡ裕可以對數(shù)據(jù)框的數(shù)據(jù)進行累計求和慎璧,并對每一行設置行名row.names床嫌,就比spply多一個命名的功能。

> i39 <- sapply(3:9, seq) # list of vectors
> i39
[[1]]
[1] 1 2 3

[[2]]
[1] 1 2 3 4

[[3]]
[1] 1 2 3 4 5

[[4]]
[1] 1 2 3 4 5 6

[[5]]
[1] 1 2 3 4 5 6 7

[[6]]
[1] 1 2 3 4 5 6 7 8

[[7]]
[1] 1 2 3 4 5 6 7 8 9

> sapply(i39, fivenum)
     [,1] [,2] [,3] [,4] [,5] [,6] [,7]
[1,]  1.0  1.0    1  1.0  1.0  1.0    1
[2,]  1.5  1.5    2  2.0  2.5  2.5    3
[3,]  2.0  2.5    3  3.5  4.0  4.5    5
[4,]  2.5  3.5    4  5.0  5.5  6.5    7
[5,]  3.0  4.0    5  6.0  7.0  8.0    9
> vapply(i39, fivenum,
+        c(Min. = 0, "1st Qu." = 0, Median = 0, "3rd Qu." = 0, Max. = 0))
        [,1] [,2] [,3] [,4] [,5] [,6] [,7]
Min.     1.0  1.0    1  1.0  1.0  1.0    1
1st Qu.  1.5  1.5    2  2.0  2.5  2.5    3
Median   2.0  2.5    3  3.5  4.0  4.5    5
3rd Qu.  2.5  3.5    4  5.0  5.5  6.5    7
Max.     3.0  4.0    5  6.0  7.0  8.0    9
> ## sapply(*, "array") -- artificial example
> (v <- structure(10*(5:8), names = LETTERS[1:4]))
 A  B  C  D 
50 60 70 80 
> f2 <- function(x, y) outer(rep(x, length.out = 3), y)
> (a2 <- sapply(v, f2, y = 2*(1:5), simplify = "array"))
, , A

     [,1] [,2] [,3] [,4] [,5]
[1,]  100  200  300  400  500
[2,]  100  200  300  400  500
[3,]  100  200  300  400  500

, , B

     [,1] [,2] [,3] [,4] [,5]
[1,]  120  240  360  480  600
[2,]  120  240  360  480  600
[3,]  120  240  360  480  600

, , C

     [,1] [,2] [,3] [,4] [,5]
[1,]  140  280  420  560  700
[2,]  140  280  420  560  700
[3,]  140  280  420  560  700

, , D

     [,1] [,2] [,3] [,4] [,5]
[1,]  160  320  480  640  800
[2,]  160  320  480  640  800
[3,]  160  320  480  640  800

> a.2 <- vapply(v, f2, outer(1:3, 1:5), y = 2*(1:5))
> a.2
, , A

     [,1] [,2] [,3] [,4] [,5]
[1,]  100  200  300  400  500
[2,]  100  200  300  400  500
[3,]  100  200  300  400  500

, , B

     [,1] [,2] [,3] [,4] [,5]
[1,]  120  240  360  480  600
[2,]  120  240  360  480  600
[3,]  120  240  360  480  600

, , C

     [,1] [,2] [,3] [,4] [,5]
[1,]  140  280  420  560  700
[2,]  140  280  420  560  700
[3,]  140  280  420  560  700

, , D

     [,1] [,2] [,3] [,4] [,5]
[1,]  160  320  480  640  800
[2,]  160  320  480  640  800
[3,]  160  320  480  640  800

> stopifnot(dim(a2) == c(3,5,4), all.equal(a2, a.2),
+           identical(dimnames(a2), list(NULL,NULL,LETTERS[1:4])))
mapply

mapply也是sapply的變形函數(shù)胸私,類似多變量的sapply厌处,但是參數(shù)定義有些變化。第一參數(shù)為自定義的FUN函數(shù)岁疼,第二個參數(shù)’…’可以接收多個數(shù)據(jù)阔涉,作為FUN函數(shù)的參數(shù)調用。

Usage

mapply(FUN, ..., MoreArgs = NULL, SIMPLIFY = TRUE,
       USE.NAMES = TRUE)

MoreArgs: 參數(shù)列表
SIMPLIFY: 是否數(shù)組化捷绒,當值array時瑰排,輸出結果按數(shù)組進行分組
USE.NAMES: 如果X為字符串,TRUE設置字符串為數(shù)據(jù)名暖侨,F(xiàn)ALSE不設置
比如椭住,比較3個向量大小,按索引順序取較大的值字逗。
> mapply(rep, 1:4, 4:1)
[[1]]
[1] 1 1 1 1

[[2]]
[1] 2 2 2

[[3]]
[1] 3 3

[[4]]
[1] 4

> mapply(rep, times = 1:4, x = 4:1)
[[1]]
[1] 4

[[2]]
[1] 3 3

[[3]]
[1] 2 2 2

[[4]]
[1] 1 1 1 1

> mapply(rep, times = 1:4, MoreArgs = list(x = 42))
[[1]]
[1] 42

[[2]]
[1] 42 42

[[3]]
[1] 42 42 42

[[4]]
[1] 42 42 42 42

> mapply(function(x, y) seq_len(x) + y,
+        c(a =  1, b = 2, c = 3),  # names from first
+        c(A = 10, B = 0, C = -10))
$`a`
[1] 11

$b
[1] 1 2

$c
[1] -9 -8 -7

> word <- function(C, k) paste(rep.int(C, k), collapse = "")
> word
function(C, k) paste(rep.int(C, k), collapse = "")
> utils::str(mapply(word, LETTERS[1:6], 6:1, SIMPLIFY = FALSE))
List of 6
 $ A: chr "AAAAAA"
 $ B: chr "BBBBB"
 $ C: chr "CCCC"
 $ D: chr "DDD"
 $ E: chr "EE"
 $ F: chr "F"
tapply

tapply用于分組的循環(huán)計算京郑,通過INDEX參數(shù)可以把數(shù)據(jù)集X進行分組,相當于group by的操作葫掉。INDEX 一個或多個因子的列表些举,每個因子的長度都與x相同。

Usage
tapply(X, INDEX, FUN = NULL, ..., default = NA, simplify = TRUE)
> require(stats)
> groups <- as.factor(rbinom(32, n = 5, prob = 0.4))
> groups
[1] 14 11 12 9  9 
Levels: 9 11 12 14
> tapply(groups, groups, length) #- is almost the same as
 9 11 12 14 
 2  1  1  1 
> table(groups)
groups
 9 11 12 14 
 2  1  1  1 
> ## contingency table from data.frame : array with named dimnames
> head(warpbreaks)
  breaks wool tension
1     26    A       L
2     30    A       L
3     54    A       L
4     25    A       L
5     70    A       L
6     52    A       L
> tapply(warpbreaks$breaks, warpbreaks[,-1], sum)
    tension
wool   L   M   H
   A 401 216 221
   B 254 259 169
> tapply(warpbreaks$breaks, warpbreaks[, 3, drop = FALSE], sum)
tension
  L   M   H 
655 475 390 
> n <- 17; fac <- factor(rep_len(1:3, n), levels = 1:5)
> fac
 [1] 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2
Levels: 1 2 3 4 5
> table(fac)
fac
1 2 3 4 5 
6 6 5 0 0 
> tapply(1:n, fac, sum)
 1  2  3  4  5 
51 57 45 NA NA 
> tapply(1:n, fac, sum, default = 0) # maybe more desirable
 1  2  3  4  5 
51 57 45  0  0 
> tapply(1:n, fac, sum, simplify = FALSE)
$`1`
[1] 51

$`2`
[1] 57

$`3`
[1] 45

$`4`
NULL

$`5`
NULL

> tapply(1:n, fac, range)
$`1`
[1]  1 16

$`2`
[1]  2 17

$`3`
[1]  3 15

$`4`
NULL

$`5`
NULL

> tapply(1:n, fac, quantile)
$`1`
   0%   25%   50%   75%  100% 
 1.00  4.75  8.50 12.25 16.00 

$`2`
   0%   25%   50%   75%  100% 
 2.00  5.75  9.50 13.25 17.00 

$`3`
  0%  25%  50%  75% 100% 
   3    6    9   12   15 

$`4`
NULL

$`5`
NULL

> tapply(1:n, fac, length) ## NA's
 1  2  3  4  5 
 6  6  5 NA NA 
> tapply(1:n, fac, length, default = 0) # == table(fac)
1 2 3 4 5 
6 6 5 0 0 
> ## example of ... argument: find quarterly means
> tapply(presidents, cycle(presidents), mean, na.rm = TRUE)
       1        2        3        4 
58.44828 56.43333 57.22222 53.07143 
> ind <- list(c(1, 2, 2), c("A", "A", "B"))
> ind
[[1]]
[1] 1 2 2

[[2]]
[1] "A" "A" "B"

> table(ind)
     ind.2
ind.1 A B
    1 1 0
    2 1 1
> tapply(1:3, ind) #-> the split vector
[1] 1 2 4
> tapply(1:3, ind, sum)
  A  B
1 1 NA
2 2  3
> ## Some assertions (not held by all patch propsals):
> nq <- names(quantile(1:5))
> stopifnot(
+   identical(tapply(1:3, ind), c(1L, 2L, 4L)),
+   identical(tapply(1:3, ind, sum),
+             matrix(c(1L, 2L, NA, 3L), 2, dimnames = list(c("1", "2"), c("A", "B")))),
+   identical(tapply(1:n, fac, quantile)[-1],
+             array(list(`2` = structure(c(2, 5.75, 9.5, 13.25, 17), .Names = nq),
+                        `3` = structure(c(3, 6, 9, 12, 15), .Names = nq),
+                        `4` = NULL, `5` = NULL), dim=4, dimnames=list(as.character(2:5))))
+   )
> 
rapply

rapply是一個遞歸版本的lapply俭厚,它只處理list類型數(shù)據(jù)户魏,對list的每個元素進行遞歸遍歷,如果list包括子元素則繼續(xù)遍歷挪挤。

### Description

`rapply` is a recursive version of `[lapply](http://127.0.0.1:22572/help/library/base/help/lapply)`.

### Usage

rapply(object, f, classes = "ANY", deflt = NULL,
       how = c("unlist", "replace", "list"), ...)
Arguments
classes : 匹配類型, ANY為所有類型
deflt: 非匹配類型的默認值
how: 3種操作方式绪抛,當為replace時,則用調用f后的結果替換原list中原來的元素电禀;當為list時幢码,新建一個list,類型匹配調用f函數(shù)尖飞,不匹配賦值為deflt店雅;當為unlist時,會執(zhí)行一次unlist(recursive = TRUE)的操作

> X <- list(list(a = pi, b = list(c = 1:1)), d = "a test")
> x
     x1 x2
[1,]  3  2
[2,]  3  1
[3,]  3  4
[4,]  3  5
> rapply(X, function(x) x, how = "replace")
[[1]]
[[1]]$`a`
[1] 3.141593

[[1]]$b
[[1]]$b$`c`
[1] 1



$d
[1] "a test"

> rapply(X, sqrt, classes = "numeric", how = "replace")
[[1]]
[[1]]$`a`
[1] 1.772454

[[1]]$b
[[1]]$b$`c`
[1] 1



$d
[1] "a test"

> rapply(X, nchar, classes = "character",
+        deflt = as.integer(NA), how = "list")
[[1]]
[[1]]$`a`
[1] NA

[[1]]$b
[[1]]$b$`c`
[1] NA



$d
[1] 6

> rapply(X, nchar, classes = "character",
+        deflt = as.integer(NA), how = "unlist")
  a b.c   d 
 NA  NA   6 
> rapply(X, nchar, classes = "character", how = "unlist")
d 
6 
> rapply(X, log, classes = "numeric", how = "replace", base = 2)
[[1]]
[[1]]$`a`
[1] 1.651496

[[1]]$b
[[1]]$b$`c`
[1] 1



$d
[1] "a test"

eapply

對一個環(huán)境空間中的所有變量進行遍歷贞铣。如果我們有好的習慣闹啦,把自定義的變量都按一定的規(guī)則存儲到自定義的環(huán)境空間中,那么這個函數(shù)將會讓你的操作變得非常方便辕坝。 這個用的比較少窍奋,之前我們要知道,什么是environment 以及作用酱畅。

Usage

eapply(env, FUN, ..., all.names = FALSE, USE.NAMES = TRUE)
> env <- new.env(hash = FALSE) # so the order is fixed
> env$a <- 1:10
> env$beta <- exp(-3:3)
> env$logic <- c(TRUE, FALSE, FALSE, TRUE)
> env
<environment: 0x000000008fc97c30>
> str(env)
<environment: 0x000000008fc97c30> 
> class(env)
[1] "environment"
> # what have we there?
> utils::ls.str(env)
a :  int [1:10] 1 2 3 4 5 6 7 8 9 10
beta :  num [1:7] 0.0498 0.1353 0.3679 1 2.7183 ...
logic :  logi [1:4] TRUE FALSE FALSE TRUE
> # compute the mean for each list element
> eapply(env, mean)
$`logic`
[1] 0.5

$beta
[1] 4.535125

$a
[1] 5.5

> unlist(eapply(env, mean, USE.NAMES = FALSE))
[1] 0.500000 4.535125 5.500000
> # median and quartiles for each element (making use of "..." passing):
> eapply(env, quantile, probs = 1:3/4)
$`logic`
25% 50% 75% 
0.0 0.5 1.0 

$beta
      25%       50%       75% 
0.2516074 1.0000000 5.0536690 

$a
 25%  50%  75% 
3.25 5.50 7.75 

> eapply(env, quantile)
$`logic`
  0%  25%  50%  75% 100% 
 0.0  0.0  0.5  1.0  1.0 

$beta
         0%         25%         50%         75%        100% 
 0.04978707  0.25160736  1.00000000  5.05366896 20.08553692 

$a
   0%   25%   50%   75%  100% 
 1.00  3.25  5.50  7.75 10.00 


R語言apply函數(shù)族筆記
掌握R語言中的apply函數(shù)族

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末琳袄,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子纺酸,更是在濱河造成了極大的恐慌窖逗,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,546評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件餐蔬,死亡現(xiàn)場離奇詭異碎紊,居然都是意外死亡,警方通過查閱死者的電腦和手機樊诺,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,224評論 3 395
  • 文/潘曉璐 我一進店門仗考,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人词爬,你說我怎么就攤上這事秃嗜。” “怎么了缸夹?”我有些...
    開封第一講書人閱讀 164,911評論 0 354
  • 文/不壞的土叔 我叫張陵痪寻,是天一觀的道長。 經(jīng)常有香客問我虽惭,道長橡类,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,737評論 1 294
  • 正文 為了忘掉前任芽唇,我火速辦了婚禮顾画,結果婚禮上,老公的妹妹穿的比我還像新娘匆笤。我一直安慰自己研侣,他們只是感情好,可當我...
    茶點故事閱讀 67,753評論 6 392
  • 文/花漫 我一把揭開白布炮捧。 她就那樣靜靜地躺著庶诡,像睡著了一般。 火紅的嫁衣襯著肌膚如雪咆课。 梳的紋絲不亂的頭發(fā)上末誓,一...
    開封第一講書人閱讀 51,598評論 1 305
  • 那天扯俱,我揣著相機與錄音,去河邊找鬼喇澡。 笑死迅栅,一個胖子當著我的面吹牛,可吹牛的內容都是我干的晴玖。 我是一名探鬼主播读存,決...
    沈念sama閱讀 40,338評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼呕屎!你這毒婦竟也來了让簿?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,249評論 0 276
  • 序言:老撾萬榮一對情侶失蹤榨惰,失蹤者是張志新(化名)和其女友劉穎拜英,沒想到半個月后静汤,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體琅催,經(jīng)...
    沈念sama閱讀 45,696評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,888評論 3 336
  • 正文 我和宋清朗相戀三年虫给,在試婚紗的時候發(fā)現(xiàn)自己被綠了藤抡。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,013評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡抹估,死狀恐怖缠黍,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情药蜻,我是刑警寧澤瓷式,帶...
    沈念sama閱讀 35,731評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站语泽,受9級特大地震影響贸典,放射性物質發(fā)生泄漏。R本人自食惡果不足惜踱卵,卻給世界環(huán)境...
    茶點故事閱讀 41,348評論 3 330
  • 文/蒙蒙 一廊驼、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧惋砂,春花似錦妒挎、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,929評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至眷柔,卻和暖如春期虾,著一層夾襖步出監(jiān)牢的瞬間积蜻,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,048評論 1 270
  • 我被黑心中介騙來泰國打工彻消, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留竿拆,地道東北人。 一個月前我還...
    沈念sama閱讀 48,203評論 3 370
  • 正文 我出身青樓宾尚,卻偏偏與公主長得像丙笋,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子煌贴,可洞房花燭夜當晚...
    茶點故事閱讀 44,960評論 2 355

推薦閱讀更多精彩內容