【问题标题】:Random sample values in a matrix without replacement in R矩阵中的随机样本值,无需在 R 中替换
【发布时间】:2015-12-27 01:25:05
【问题描述】:

我已经在 Stack Overflow 上搜索了大约 45 分钟,所以如果确实已经发布了这样的问题 - 我很抱歉!

例如,假设我有一个 6 行 3 列的小矩阵,我需要从中随机选择值:每列 2 个值。

             Feb    Mar    Apr
Mt_Rainier   220.0  200.0  130.0
Vancouver    104.6  113.9  88.5
Neah_Bay     226.0  206.0  134.0
Portland     94.0   94.0   68.6
Olympic_Park 53.3   66.0   45.7
Orcas_Island 71.0   61.0   48.0

也就是说,我需要每个月选择 2 个位置,但不能两次选择同一个位置。

【问题讨论】:

    标签: r matrix sample random-sample


    【解决方案1】:

    n作为每列选择的值的数量,可以构造一个带有n*ncol(m)行的索引矩阵,其中行索引是从可用行范围内不替换地采样的,列索引是指定的以常规顺序出现n 每个:

    set.seed(1L);
    m <- matrix(c(220.0,104.6,226.0,94.0,53.3,71.0,200.0,113.9,206.0,94.0,66.0,61.0,130.0,88.5,134.0,68.6,45.7,48.0),6,dimnames=list(c('Mt_Rainier','Vancouver','Neah_Bay','Portland','Olympic_Park','Orcas_Island'),c('Feb','Mar','Apr')));
    n <- 2L;
    im <- matrix(c(sample(nrow(m),n*ncol(m)),rep(seq_len(ncol(m)),each=n)),ncol=2L);
    im;
    ##      [,1] [,2]
    ## [1,]    2    1
    ## [2,]    6    1
    ## [3,]    3    2
    ## [4,]    4    2
    ## [5,]    1    3
    ## [6,]    5    3
    m[im];
    ## [1] 104.6  71.0 206.0  94.0 130.0  45.7
    rownames(m)[im[,1L]];
    ## [1] "Vancouver"    "Orcas_Island" "Neah_Bay"     "Portland"     "Mt_Rainier"   "Olympic_Park"
    

    这样可以确保每个输入列都得到准确的n 选择,并且不会多次选择输入行。

    【讨论】:

    • 一个问题。如果我只有 5 行怎么办?这意味着我只能从 1 列中选择 1 个值,而不是 2 个。
    【解决方案2】:

    您希望结果是什么样的(确切地说)?您是否希望从矩阵的每一列中采样 ?如果是这样,请尝试:

    c(                               ## collapse matrix result to a vector
       apply(m,MARGIN=2,FUN=sample,  ## sample from each column
         size=2,replace=FALSE        ## additional arguments to sample()
       )
      )
    

    【讨论】:

    • 我之前也尝试过,replace = FALSE 在从列中选择时有效,但对行无效。 IE。 1 列中的 2 行不会相同,但可以在其他列中使用相同的行...
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-19
    • 1970-01-01
    • 2023-04-10
    • 2014-12-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多