8wDlpd.png
8wDFp9.png
8wDEOx.png
8wDMfH.png
8wDKte.png

分组函数(tapply、by、aggregate)和 *apply 系列

Gereon will not feed AI 2月前

88 0

每当我想在 R 中执行 \'map\'py 操作时,我通常会尝试使用 apply 系列中的函数。但是,我从未完全理解它们之间的区别 -- 如何 {sapply、lapply 等}...

每当我想在 R 中执行某些\'map\'py 操作时,我通常会尝试使用该 apply 系列中的函数。

然而,我从来没有完全理解它们之间的区别——{ sapply , lapply 等} 如何将函数应用于输入/分组输入,输出会是什么样子,甚至输入可以是什么——所以我经常只是仔细检查它们直到得到我想要的。

有人可以解释一下何时如何使用哪一个吗?

我目前的理解(可能不正确/不完整)是......

  1. p5

  2. p6

  3. apply(matrix, 1/2, f) :输入是一个矩阵。输出是一个向量,其中元素 i 是 f(矩阵的第 i 行/第 i 列)
  4. tapply(vector, grouping, f) :输出是一个矩阵/数组,其中矩阵/数组中的元素是 f 向量分组 g ,并 g 被推送到行/列名称
  5. by(dataframe, grouping, f) :设为 g 分组。应用于 f 组/数据框的每一列。漂亮地打印分组和 f 每列的值。
  6. aggregate(matrix, grouping, f) :类似于 by ,但聚合不会漂亮地打印输出,而是将所有内容粘贴到数据框中。

附带问题:我还没有学过 plyr 或 reshape - 是否会 plyr 完全 reshape 取代这些?

帖子版权声明 1、本帖标题:分组函数(tapply、by、aggregate)和 *apply 系列
    本站网址:http://xjnalaquan.com/
2、本网站的资源部分来源于网络,如有侵权,请联系站长进行删除处理。
3、会员发帖仅代表会员个人观点,并不代表本站赞同其观点和对其真实性负责。
4、本站一律禁止以任何方式发布或转载任何违法的相关信息,访客发现请向站长举报
5、站长邮箱:yeweds@126.com 除非注明,本帖由Gereon will not feed AI在本站《list》版块原创发布, 转载请注明出处!
最新回复 (0)
  • R 有许多 *apply 函数,这些函数在帮助文件中有详细描述(例如 ?apply )。不过,这些函数数量足够多,初学者可能难以决定哪一个适合他们的情况,甚至无法记住所有函数。他们可能有一种普遍的感觉,“我应该在这里使用 *apply 函数”,但一开始要记住所有函数可能很难。

    尽管(其他答案中指出)*apply 系列的大部分功能都包含在极受欢迎的软件包中 plyr ,但基本功能仍然有用且值得了解。

    这个答案旨在为新用户提供某种 指引 ,帮助他们找到适合特定问题的正确 *apply 函数。请注意,这并不是 简单 地重复或替换 R 文档!希望这个答案能帮助您决定哪个 *apply 函数适合您的情况,然后由您进一步研究它。除了一个例外,性能差异将不会得到解决。

    • p3

       # Two dimensional matrix M <- matrix(seq(1,16), 4, 4) # apply min to rows apply(M, 1, min) [1] 1 2 3 4 # apply max to columns apply(M, 2, max) [1]  4  8 12 16 # 3 dimensional array M <- array( seq(32), dim = c(4,4,2)) # Apply sum across each M[*, , ] - i.e Sum across 2nd and 3rd dimension apply(M, 1, sum) # Result is one-dimensional [1] 120 128 136 144 # Apply sum across each M[*, *, ] - i.e Sum across 3rd dimension apply(M, c(1,2), sum) # Result is two-dimensional      [,1] [,2] [,3] [,4] [1,]   18   26   34   42 [2,]   20   28   36   44 [3,]   22   30   38   46 [4,]   24   32   40   48

      p4

    • p5

      p6

       x <- list(a = 1, b = 1:3, c = 10:100)  lapply(x, FUN = length)  $a  [1] 1 $b  [1] 3 $c  [1] 91 lapply(x, FUN = sum)  $a  [1] 1 $b  [1] 6 $c  [1] 5005
    • p7

      p8

       x <- list(a = 1, b = 1:3, c = 10:100) # Compare with above; a named vector, not a list  sapply(x, FUN = length)   a  b  c    1  3 91 sapply(x, FUN = sum)    a    b    c     1    6 5005 

      p9

       sapply(1:5,function(x) rnorm(3,x))

      p10

       sapply(1:5,function(x) matrix(x,2,2))

      p11

       sapply(1:5,function(x) matrix(x,2,2), simplify = "array")

      p12

    • p13

      p14

       x <- list(a = 1, b = 1:3, c = 10:100) #Note that since the advantage here is mainly speed, this # example is only for illustration. We're telling R that # everything returned by length() should be an integer of  # length 1.  vapply(x, FUN = length, FUN.VALUE = 0L)  a  b  c   1  3 91
    • p15

      p16

       #Sums the 1st elements, the 2nd elements, etc.  mapply(sum, 1:5, 1:5, 1:5)  [1]  3  6  9 12 15 #To do rep(1,4), rep(2,3), etc. mapply(rep, 1:4, 4:1)    [[1]] [1] 1 1 1 1 [[2]] [1] 2 2 2 [[3]] [1] 3 3 [[4]] [1] 4
    • p17

       Map(sum, 1:5, 1:5, 1:5) [[1]] [1] 3 [[2]] [1] 6 [[3]] [1] 9 [[4]] [1] 12 [[5]] [1] 15
    • 第18页

      第19页

       # Append ! to string, otherwise increment myFun <- function(x){     if(is.character(x)){       return(paste(x,"!",sep=""))     }     else{       return(x + 1)     } } #A nested list structure l <- list(a = list(a1 = "Boo", b1 = 2, c1 = "Eeek"),            b = 3, c = "Yikes",            d = list(a2 = 1, b2 = list(a3 = "Hey", b3 = 5))) # Result is named vector, coerced to character           rapply(l, myFun) # Result is a nested list like l, with values altered rapply(l, myFun, how="replace")
    • 第20页

      第21页

      第22页

       x <- 1:20

      第23页

       y <- factor(rep(letters[1:5], each = 4))

      第24页

       tapply(x, y, sum)    a  b  c  d  e   10 26 42 58 74 

      第25页

返回
作者最近主题: