随机抽样网格而无需替换

时间:2013-01-12 00:00:36

标签: r random sampling

我想在没有替换的情况下随机抽样数据集,并认为这很容易。不幸的是,它不是,我无法在互联网上找到R代码来做到这一点。最终我得到了这个代码。它似乎过于复杂,但似乎确实有效。

set.seed(1234)

n.samples <- 10

my.grid <- read.table(text = '
state county y2000 y2001 y2002 y2003 y2004 y2005 y2006
  A      A      5    10    15    20    25    30    35
  A      B     15    20    25    30    35    40    45
  A      C     45    40    35    30    25    20    15
  A      Q      1     2     3     4     5     6     7
  B      A      9     8     7     6     5     4     3 
  B      B     90    91    92    93    94    95    96
  B      G     10    20    30    40    50    60    70
  B      H    100   200   300   400   500   600   700
  C      J    900   850   800   750   700   650   600
  C      K      2     4     6     8    10    12    14
  C      M      3     6     9    12    15    18    21
  C      P     50    45    40    35    30    25    20
', header = TRUE)

my.grid

population <- expand.grid(row  = c(seq(1,nrow(my.grid))), 
                          col  = c(seq(3,ncol(my.grid))))

rows <- seq(1, nrow(population))

sample <- sample(rows, n.samples, replace=FALSE)

use.these <- population[sample,]
use.these

measurement <- rep(NA, nrow(use.these))
my.area     <- my.grid[use.these[,1], c(1:2)]
my.year     <- names(my.grid)[use.these[,2]]

for(i in 1:nrow(use.these)) {

   measurement[i] <- my.grid[use.these[i,1], use.these[i,2]]

}

my.samples <- data.frame(use.these, my.area, my.year, measurement)
my.samples

my.samples的输出:

   row col state county my.year measurement
10  10   3     C      K   y2000           2
52   4   7     A      Q   y2004           5
50   2   7     A      B   y2004          35
51   3   7     A      C   y2004          25
69   9   8     C      J   y2005         650
81   9   9     C      J   y2006         600
1    1   3     A      A   y2000           5
18   6   4     B      B   y2001          91
79   7   9     B      G   y2006          70
39   3   6     A      C   y2003          30

有没有更好的方法,特别是在基地?我听说过sampling包。由于我的代码似乎有效,我只是要求可能更好的方法,或许我不应该在这里发布,尽管它似乎是一个常见且重要的主题。如果这不是一个合适的帖子,我可以将其删除并将代码放在我的Wikipedia用户页面上。感谢您的任何建议。

2 个答案:

答案 0 :(得分:2)

将years列转换为矩阵;来自行* col(= length)的样本作为索引。使用1+(idx%/%nrow(。))作为原始行的索引,并使用1 +(idx %% ncol(。))作为年份名称的索引。那你就不需要“没有steenking循环”。这是一个非常好的问题,可能会让你超越循环思维。

set.seed(1234)
n.samples <- 10
 size <- length(mat); picks <- sample(size, n.samples)
 picks
# [1] 10 52 50 51 69 81  1 18 79 39
 cbind(my.grid[ 1+(picks %/% nrow(my.grid) ), 1:2] , 
       names(my.grid)[-(1:2)][1+(picks %% 7)],  
       mat[picks])
#---------------------------------------
    state county names(my.grid)[-(1:2)][1 + (picks%%7)] mat[picks]
1       A      A                                  y2003          2
5       B      A                                  y2003          5
5.1     B      A                                  y2001         35
5.2     B      A                                  y2002         25
6       B      B                                  y2006        650
7       B      G                                  y2004        600
1.1     A      A                                  y2001          5
2       A      B                                  y2004         91
7.1     B      G                                  y2002         70
4       A      Q                                  y2004         30

答案 1 :(得分:1)

当我尝试使用DWin的答案时,我意识到它返回了正确的measurement,但它似乎没有返回正确的statecountyyear。我修改了DWin的代码如下,它似乎返回与原始帖子中的代码相同的答案。我与自己就是否撰写评论或发布第二个答案进行了辩论。如果其他人认为在DWin评论后认为合适,我可以删除这个答案。

set.seed(1234)

n.samples <- 10

my.grid <- read.table(text = '
state county y2000 y2001 y2002 y2003 y2004 y2005 y2006
  A      A      5    10    15    20    25    30    35
  A      B     15    20    25    30    35    40    45
  A      C     45    40    35    30    25    20    15
  A      Q      1     2     3     4     5     6     7
  B      A      9     8     7     6     5     4     3 
  B      B     90    91    92    93    94    95    96
  B      G     10    20    30    40    50    60    70
  B      H    100   200   300   400   500   600   700
  C      J    900   850   800   750   700   650   600
  C      K      2     4     6     8    10    12    14
  C      M      3     6     9    12    15    18    21
  C      P     50    45    40    35    30    25    20
', header = TRUE)

my.grid

mat <- as.matrix(my.grid[,3:ncol(my.grid)])
mat

size <- length(mat)

picks <- sample(size, n.samples)
picks

# [1] 10 52 50 51 69 81  1 18 79 39

my.column <- 2 + (1 + (picks %/% (nrow(my.grid))))
my.row    <- picks - (picks %/% nrow(mat)) * nrow(mat)

my.samples2 <- cbind(my.row, my.column, my.grid[my.row, 1:2], names(my.grid)[my.column], mat[picks])
names(my.samples2) <- c('row','column','state','county','year','measurement')
my.samples2

给出:

    row column state county  year measurement
10   10      3     C      K y2000           2
4     4      7     A      Q y2004           5
2     2      7     A      B y2004          35
3     3      7     A      C y2004          25
9     9      8     C      J y2005         650
9.1   9      9     C      J y2006         600
1     1      3     A      A y2000           5
6     6      4     B      B y2001          91
7     7      9     B      G y2006          70
3.1   3      6     A      C y2003          30