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

年の列を行列に変換します。インデックスとしての行*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が返されなかったようです。DWinのコードを次のように変更しましたが、元の投稿のコードと同じ回答が返されるようです。コメントを書くか、2番目の回答を投稿するかについて自分自身で議論しました。DWinがレビューした後、他の人が適切と判断した場合は、この回答を削除できます。statecountyyear

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 に答える