了解为什么R中的sapply返回更长的向量

问题描述 投票:1回答:3

我正在通过R中的各行代码进行解析,以更好地理解大型函数。虽然我知道sapply在矢量上具有Apple函数,但是我在理解它在特定实例中的功能时遇到了麻烦。不幸的是,我在其他地方找不到关于这个确切问题的明确解释。

如果使用下面的代码示例模拟数据,则变量Y是具有2000个值的向量,而calc_sizes是Y中的唯一值数量(87个唯一值)。将sapply应用于likelihoods时,将在likelihoods[calc_sizes]<-sapply(calc_sizes, nb.likelihood)的上下文中完成。这将返回688个值的向量

sapply在这里做什么,为什么/为什么返回688而不是87的向量?

要清楚,代码运行正常-没有技术问题。我只喜欢了解学习,而不是盲目地编写最终可以工作的代码(因此,我不必经常打扰这个论坛)。

您应该能够逐字复制并粘贴代码以获得提及的结果。谢谢您的见解!

#################################################################
#Functions that are needed to generate and apply to sample data
#################################################################
bp <- function(gens=20, init.size=1, offspring, ...){  
  Z <- list() #initiate the list
  Z[[1]] <- init.size #set the first position of the list as the number of index cases
  i <- 1 
  while(sum(Z[[i]]) > 0 && i <= gens) { 
    Z[[i+1]] <- offspring(sum(Z[[i]]), ...) 
    i <- i+1 
  } 
  return(Z)
}
nb.likelihood<-function(x){
  lgamma(k*x+(x-1))-(lgamma(k*x)+lgamma(x+1))+(x-1)*log(r0/k)-(k*x+(x-1))*log(1+r0/k)    
}

####################
#Generate sample data
####################
set.seed(123)
Z<-replicate(n=2000,bp(offspring=rnbinom,mu=0.9,size=0.25)) 
Y<-unlist(lapply(Z,function(x) sum(unlist(x))))

#Generate variables in question 
calc_sizes<-unique(c(1,Y))
likelihoods<-c()
#########################
#line of code in question
#########################
likelihoods[calc_sizes]<-sapply(calc_sizes, nb.likelihood) 
r sapply
3个回答
1
投票

让我给您展示一个简单的示例,希望它使事情更容易理解。

假设v是具有从110的值的向量,并且idxv的索引的子集,其中函数func将根据以下内容对v执行某些替换操作到idx

v <- 1:10
idx <- 2:6
func <- function(k) -v[k]**2

到目前为止,v中的内容如下:

> v
 [1]  1  2  3  4  5  6  7  8  9 10

然后,使用sapply(idx, func)将功能func应用于idx中的每个元素,即c(-v[2]^2,-v[3]^2,-v[4]^2,-v[5]^2,-v[6]^2)将从sapply(idx, func)中输出。

最后,输出将分配给v[idx]以代替原始值

v[idx] <- sapply(idx, func)

然后您可以看到

> v
 [1]   1  -4  -9 -16 -25 -36   7   8   9  10

1
投票

[进行likelihoods[calc_sizes] <- sapply(calc_sizes, nb.likelihood)时,您要将sapply(calc_sizes, nb.likelihood)的结果保存到位置likelihoods上的矢量calc_sizes中。

由于calc_sizes的值从1到688,R将likelihoods转换为688长度向量。但是,如果您运行table(is.na(calc_sizes)),您只会看到不缺少87个位置。


0
投票

[专门回答688的原因是,您正在通过从calc_size的值到空向量likelihoods的无序索引分配值。具体地,calc_sizes包括87个整数值。请注意,最小项是1,最大项是688。

calc_sizes

 [1]   1  40   2   3 180   4  19  21  10  49   6  18   5  11  81  23 186 189   8
[20]  41  27  20   7  12  68   9  25  16 131  15  51  26  22  17 648  24  30  32
[39]  28  36  53  96  47  14 548 109  38  31  99 106  34  39 607 100 233  42  66
[58] 129  33 170 102  70  13  46  63  79  97 447 460 688 346 130  44  69 620 113
[77]  92 256 153  78 462 325  61  64  54  76  86

但是,您想要的sapply也包含87:

sapply(calc_sizes, nb.likelihood) 

 [1]  -1.098612 -11.788381  -2.602690  -3.413620 -30.541489  -4.001407
 [7]  -8.187640  -8.575276  -6.146104 -13.154588  -4.881330  -7.987619
[13]  -4.475865  -6.410490 -17.680645  -8.948901 -31.297439 -31.674821
[19]  -5.565697 -11.943435  -9.663029  -8.383385  -5.240275  -6.661805
[25] -15.886160  -5.865802  -9.310881  -7.572668 -24.292698  -7.356445
[31] -13.450466  -9.488087  -8.763676  -7.782825 -87.586858  -9.131222
[37] -10.175841 -10.509013  -9.835872 -11.158148 -13.744013 -19.702968
[43] -12.856183  -7.133302 -75.557026 -21.425116 -11.475373 -10.343221
[49] -20.102594 -21.029806 -10.836219 -11.632377 -82.659672 -20.235490
[55] -37.171587 -12.097586 -15.605646 -24.034010 -10.673316 -29.277798
[61] -20.500835 -16.165367  -6.902190 -12.705964 -15.182243 -17.407459
[67] -19.836336 -63.355209 -64.929415 -92.388061 -51.074698 -24.163398
[73] -12.403344 -16.025922 -84.222650 -21.950431 -19.167825 -40.021951
[79] -27.117199 -17.270506 -65.171492 -48.507264 -14.898089 -15.323743
[85] -13.889967 -16.995849 -18.359679

因此,在您的分配中,您正在按索引位置分配sapply的值,并逐元素展开。

likelihoods[calc_sizes] <- sapply(calc_sizes, nb.likelihood) 

likelihoods

  [1]  -1.098612  -2.602690  -3.413620  -4.001407  -4.475865  -4.881330
  [7]  -5.240275  -5.565697  -5.865802  -6.146104  -6.410490  -6.661805
 [13]  -6.902190  -7.133302  -7.356445  -7.572668  -7.782825  -7.987619
 [19]  -8.187640  -8.383385  -8.575276  -8.763676  -8.948901  -9.131222
 [25]  -9.310881  -9.488087  -9.663029  -9.835872         NA -10.175841
 [31] -10.343221 -10.509013 -10.673316 -10.836219         NA -11.158148
 [37]         NA -11.475373 -11.632377 -11.788381 -11.943435 -12.097586
 [43]         NA -12.403344         NA -12.705964 -12.856183         NA
 [49] -13.154588         NA -13.450466         NA -13.744013 -13.889967
 [55]         NA         NA         NA         NA         NA         NA
 [61] -14.898089         NA -15.182243 -15.323743         NA -15.605646
 [67]         NA -15.886160 -16.025922 -16.165367         NA         NA
 [73]         NA         NA         NA -16.995849         NA -17.270506
 [79] -17.407459         NA -17.680645         NA         NA         NA
 [85]         NA -18.359679         NA         NA         NA         NA
 [91]         NA -19.167825         NA         NA         NA -19.702968
 [97] -19.836336         NA -20.102594 -20.235490         NA -20.500835
[103]         NA         NA         NA -21.029806         NA         NA
[109] -21.425116         NA         NA         NA -21.950431         NA
[115]         NA         NA         NA         NA         NA         NA
[121]         NA         NA         NA         NA         NA         NA
[127]         NA         NA -24.034010 -24.163398 -24.292698         NA
[133]         NA         NA         NA         NA         NA         NA
[139]         NA         NA         NA         NA         NA         NA
[145]         NA         NA         NA         NA         NA         NA
[151]         NA         NA -27.117199         NA         NA         NA
[157]         NA         NA         NA         NA         NA         NA
[163]         NA         NA         NA         NA         NA         NA
[169]         NA -29.277798         NA         NA         NA         NA
[175]         NA         NA         NA         NA         NA -30.541489
[181]         NA         NA         NA         NA         NA -31.297439
[187]         NA         NA -31.674821         NA         NA         NA
[193]         NA         NA         NA         NA         NA         NA
[199]         NA         NA         NA         NA         NA         NA
[205]         NA         NA         NA         NA         NA         NA
[211]         NA         NA         NA         NA         NA         NA
[217]         NA         NA         NA         NA         NA         NA
[223]         NA         NA         NA         NA         NA         NA
[229]         NA         NA         NA         NA -37.171587         NA
[235]         NA         NA         NA         NA         NA         NA
[241]         NA         NA         NA         NA         NA         NA
[247]         NA         NA         NA         NA         NA         NA
[253]         NA         NA         NA -40.021951         NA         NA
[259]         NA         NA         NA         NA         NA         NA
[265]         NA         NA         NA         NA         NA         NA
[271]         NA         NA         NA         NA         NA         NA
[277]         NA         NA         NA         NA         NA         NA
[283]         NA         NA         NA         NA         NA         NA
[289]         NA         NA         NA         NA         NA         NA
[295]         NA         NA         NA         NA         NA         NA
[301]         NA         NA         NA         NA         NA         NA
[307]         NA         NA         NA         NA         NA         NA
[313]         NA         NA         NA         NA         NA         NA
[319]         NA         NA         NA         NA         NA         NA
[325] -48.507264         NA         NA         NA         NA         NA
[331]         NA         NA         NA         NA         NA         NA
[337]         NA         NA         NA         NA         NA         NA
[343]         NA         NA         NA -51.074698         NA         NA
[349]         NA         NA         NA         NA         NA         NA
[355]         NA         NA         NA         NA         NA         NA
[361]         NA         NA         NA         NA         NA         NA
[367]         NA         NA         NA         NA         NA         NA
[373]         NA         NA         NA         NA         NA         NA
[379]         NA         NA         NA         NA         NA         NA
[385]         NA         NA         NA         NA         NA         NA
[391]         NA         NA         NA         NA         NA         NA
[397]         NA         NA         NA         NA         NA         NA
[403]         NA         NA         NA         NA         NA         NA
[409]         NA         NA         NA         NA         NA         NA
[415]         NA         NA         NA         NA         NA         NA
[421]         NA         NA         NA         NA         NA         NA
[427]         NA         NA         NA         NA         NA         NA
[433]         NA         NA         NA         NA         NA         NA
[439]         NA         NA         NA         NA         NA         NA
[445]         NA         NA -63.355209         NA         NA         NA
[451]         NA         NA         NA         NA         NA         NA
[457]         NA         NA         NA -64.929415         NA -65.171492
[463]         NA         NA         NA         NA         NA         NA
[469]         NA         NA         NA         NA         NA         NA
[475]         NA         NA         NA         NA         NA         NA
[481]         NA         NA         NA         NA         NA         NA
[487]         NA         NA         NA         NA         NA         NA
[493]         NA         NA         NA         NA         NA         NA
[499]         NA         NA         NA         NA         NA         NA
[505]         NA         NA         NA         NA         NA         NA
[511]         NA         NA         NA         NA         NA         NA
[517]         NA         NA         NA         NA         NA         NA
[523]         NA         NA         NA         NA         NA         NA
[529]         NA         NA         NA         NA         NA         NA
[535]         NA         NA         NA         NA         NA         NA
[541]         NA         NA         NA         NA         NA         NA
[547]         NA -75.557026         NA         NA         NA         NA
[553]         NA         NA         NA         NA         NA         NA
[559]         NA         NA         NA         NA         NA         NA
[565]         NA         NA         NA         NA         NA         NA
[571]         NA         NA         NA         NA         NA         NA
[577]         NA         NA         NA         NA         NA         NA
[583]         NA         NA         NA         NA         NA         NA
[589]         NA         NA         NA         NA         NA         NA
[595]         NA         NA         NA         NA         NA         NA
[601]         NA         NA         NA         NA         NA         NA
[607] -82.659672         NA         NA         NA         NA         NA
[613]         NA         NA         NA         NA         NA         NA
[619]         NA -84.222650         NA         NA         NA         NA
[625]         NA         NA         NA         NA         NA         NA
[631]         NA         NA         NA         NA         NA         NA
[637]         NA         NA         NA         NA         NA         NA
[643]         NA         NA         NA         NA         NA -87.586858
[649]         NA         NA         NA         NA         NA         NA
[655]         NA         NA         NA         NA         NA         NA
[661]         NA         NA         NA         NA         NA         NA
[667]         NA         NA         NA         NA         NA         NA
[673]         NA         NA         NA         NA         NA         NA
[679]         NA         NA         NA         NA         NA         NA
[685]         NA         NA         NA -92.388061

注意calc_size的第70个项是688,sapply(calc_sizes, nb.likelihood)的第70个项是-92.38806(上面的最后一个数值)。

calc_sizes[70]
# [1] 688

sapply(calc_sizes, nb.likelihood)[70]
# [1] -92.3880

要解决,请沿着calc_sizes的长度进行分配,以1:87进行分配。另外,考虑用长度初始化likelihoods,而不要在c()之后增加对象。

likelihoods <- vector(mode="numeric", length=length(calc_sizes))

likelihoods[seq_along(calc_sizes)] <- sapply(calc_sizes, nb.likelihood) 
# likelihoods[1:length(calc_sizes)] <- sapply(calc_sizes, nb.likelihood) 

尽管如此,对于应用族函数,由于它们返回值,因此可以直接直接赋值给它

likelihoods <- sapply(calc_sizes, nb.likelihood) 

likelihoods
 [1]  -1.098612 -11.788381  -2.602690  -3.413620 -30.541489  -4.001407
 [7]  -8.187640  -8.575276  -6.146104 -13.154588  -4.881330  -7.987619
[13]  -4.475865  -6.410490 -17.680645  -8.948901 -31.297439 -31.674821
[19]  -5.565697 -11.943435  -9.663029  -8.383385  -5.240275  -6.661805
[25] -15.886160  -5.865802  -9.310881  -7.572668 -24.292698  -7.356445
[31] -13.450466  -9.488087  -8.763676  -7.782825 -87.586858  -9.131222
[37] -10.175841 -10.509013  -9.835872 -11.158148 -13.744013 -19.702968
[43] -12.856183  -7.133302 -75.557026 -21.425116 -11.475373 -10.343221
[49] -20.102594 -21.029806 -10.836219 -11.632377 -82.659672 -20.235490
[55] -37.171587 -12.097586 -15.605646 -24.034010 -10.673316 -29.277798
[61] -20.500835 -16.165367  -6.902190 -12.705964 -15.182243 -17.407459
[67] -19.836336 -63.355209 -64.929415 -92.388061 -51.074698 -24.163398
[73] -12.403344 -16.025922 -84.222650 -21.950431 -19.167825 -40.021951
[79] -27.117199 -17.270506 -65.171492 -48.507264 -14.898089 -15.323743
[85] -13.889967 -16.995849 -18.359679

Online Demo

© www.soinside.com 2019 - 2024. All rights reserved.