理解为什么在 R returns 更长的向量中应用

Understanding why sapply in R returns vector of longer length

我正在分析 R 中的各个代码行,以便更好地理解大型函数。虽然我知道 sapply apples 一个向量上的函数,但我无法理解它在特定实例中的作用。不幸的是,我在其他地方找不到关于这个确切问题的明确解释。

如果您使用以下代码示例模拟数据,变量 Y 是一个包含 2000 个值的向量,calc_sizes 是 Y 中唯一值的数量(87 个唯一值)。当 sapply 应用于 likelihoods 时,它是在 likelihoods[calc_sizes]<-sapply(calc_sizes, nb.likelihood) 的上下文中完成的。这 return 是一个包含 688 个值的向量

sapply 在这里做什么,how/why 是 return 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) 

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

由于 calc_sizes 值从 1 到 688,R 将 likelihoods 转换为 688 长度向量。但是如果你 运行 table(is.na(calc_sizes)) 你会看到只有 87 个位置没有丢失。

让我给你看一个更简单的例子,希望能让你更容易理解。

假设 v 是一个向量,其值从 110,并且 idxv 的索引的子集,其中函数func会根据idxv进行一些替换操作。

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)就是对idx中的每个元素应用函数func,即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

具体回答 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) 

然而,由于应用了族函数 return 一个对象,直接分配给 sapply 调用而不初始化任何东西。

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