【问题标题】:Using sample() when x is of varying length当 x 长度不同时使用 sample()
【发布时间】:2013-08-29 16:43:12
【问题描述】:

我有一个列表,其中不同行的长度不同(有时长度为 1)

我想通过使用将样本应用于每一行

sapply(1:99,function(x) sample(mat[[]],1))

问题当然是,只要行的长度是一个样本,就会从 1:x 中选择一个样本,而不是总是选择相同的数字。

有没有办法强制样本在长度为 1 时返回相同的值? 有什么替代方法可以避免这个问题?

【问题讨论】:

  • “我有一个矩阵,其中不同行的长度不同” - 我认为您将不得不更全面地解释这一点。一个矩阵不能有不同的“长度”行。
  • 这不能回答您的问题,但sapply 的格式应为:sapply(mat[1:99], sample, size=1)

标签: r


【解决方案1】:

由于1:x 被硬编码为sample,最好的选择就是使用ifelse

sapply(mat[1:99], function(x) if(length(x)==1) x else sample(x, 1))

【讨论】:

  • mat[[1:99]] 中的错误:递归索引在第 2 级失败
  • 问题是我有一个需要用 [[]] 索引的列表
  • 不,如果你使用的是sapply,那么你就不要使用[[]]sapply 会为你做到这一点。
  • sapply 中使用向量化的ifelse 函数似乎很奇怪,因为它不会被赋予超过1 个元素的向量。常规的if ... else ... 可能更有效。
  • @GregSnow 你可能是对的 - 如果每个条件只有一行代码,我想我只是习惯使用ifelse
【解决方案2】:

您可以使用帮助页面?sample上的示例:

resample <- function(x, ...) x[sample.int(length(x), ...)]

只需使用上面的resample 函数代替sample。如果您希望它的工作方式有所不同,或者对其进行重命名、修改等。

为了满足我自己的好奇心,我对到目前为止的建议做了一个快速基准测试:

library(microbenchmark)

mylist <- lapply( sample( rep( 1:10, 10 ) ), rpois, lambda=3 )

resample <- function(x, ...) x[sample.int(length(x), ...)]
sample1 <- function(x) x[sample.int(length(x), 1)]
ie1 <- function(x) if(length(x)==1) x else sample(x,1)
ie2 <- function(x) ifelse( length(x)==1, x, sample(x,1) )
rep1 <- function(x) { if( length(x) < 2 ) x <- rep(x,2); sample(x,1) }

(out <- microbenchmark( 
    sapply(mylist, resample, size=1),
    sapply(mylist, sample1),
    sapply(mylist, ie1),
    sapply(mylist, ie2),
    sapply(mylist, rep1)
))

有结果:

Unit: microseconds
                               expr      min        lq    median        uq      max neval
 sapply(mylist, resample, size = 1)  360.846  388.1455  398.4085  409.4925 2036.169   100
            sapply(mylist, sample1)  339.499  365.7720  375.8300  391.6345 1846.100   100
                sapply(mylist, ie1)  493.853  534.2900  543.3205  561.3840 2091.589   100
                sapply(mylist, ie2) 1225.397 1291.6955 1328.4365 1395.1455 3787.850   100
               sapply(mylist, rep1)  566.926  614.3405  627.2720  649.4405 2178.209   100

【讨论】:

    【解决方案3】:

    一旦你有 matrixdataframe 或任何它被理顺的,这是我使用的解决方法:

    vec.len<-length(my_vector)
    if (vec.len <2 ) my_vector<-rep(my_vector,2)
    sample(my_vector,1)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-01
      相关资源
      最近更新 更多