2

我想随机抽取一个数据集而不进行替换,并认为这很容易。对我来说不幸的是它不是,我无法在互联网上找到 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包裹。由于我的代码似乎可以工作,而且我只是在寻求可能的更好方法,也许我不应该在此处发布此内容,尽管它似乎是一个常见且重要的主题。如果这不是一个合适的帖子,我可以删除它并将代码放在我的维基百科用户页面上。感谢您的任何建议。

4

2 回答 2

2

将年份列转换为矩阵;来自 row * 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
于 2013-01-12T00:45:14.247 回答
1

当我尝试使用 DWin 的答案时,我意识到它返回了正确的measurement,但似乎没有返回正确的statecounty或者year. 我修改了 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
于 2013-01-14T23:30:23.487 回答