5

R で単純なループを作成しようとしています。大きなデータセットがあり、このデータセットから複数の小さなサンプルを作成し、それらを Excel にエクスポートしたいと考えています。

私はそれがこのように機能すると思っていましたが、そうではありません:

 idorg <- c(1,2,3,4,5)
 x <- c(14,20,21,16,17)
 y <- c(31,21,20,50,13)
 dataset <- cbind (idorg,x,y)


 for (i in 1:4)
 {
 attempt[i] <- dataset[sample(1:nrow(dataset), 3, replace=FALSE),]
 write.table(attempt[i], "C:/Users/me/Desktop/WWD/Excel/dataset[i].xls", sep='\t')
 }

Stata では、このようなループを実行するときにデータを保存して復元する必要がありますが、これは R でも必要ですか?

4

2 に答える 2

5

次の問題があります。

  1. 試行は宣言されていないため、attempt[i]に割り当てることはできません。ループ内で埋める行列にするか (サンプルを保持したい場合)、一時変数として使用しますattempt
  2. ファイル名は文字通りのものです。変数の値を使用するpaste()か、ファイル名に含める必要があります。sprintf()i

コードの作業バージョンは次のとおりです。

idorg <- c(1,2,3,4,5)
x <- c(14,20,21,16,17)
y <- c(31,21,20,50,13)
dataset <- cbind (idorg,x,y)

for (i in 1:4)  {
  attempt <- dataset[sample(1:nrow(dataset), 3, replace=FALSE),]
  write.table(attempt, sprintf( "C:/Users/me/Desktop/WWD/Excel/dataset[%d].xls", i ), sep='\t')
}

Excel はこのようなタブ区切りの表を読み取ることができますか? わからない; コンマ区切りのテーブルを作成し、.csv.

于 2012-10-16T07:23:22.030 に答える
2

Stata とは異なり、R ではこの種の操作のためにデータを保存および復元する必要はありません。

1 月の解決策で問題は解決すると思いますが、別の方法を共有したいと思います: を使用lapply()して、データセットのすべてのサンプルのリストを取得します。

set.seed(1) # So you can reproduce these results
temp <- setNames(lapply(1:4,
                        function(x) { 
                          x <- dataset[sample(1:nrow(dataset),
                                              3, replace = FALSE), ]; x }),
                 paste0("attempt.", 1:4))

これにより、list()4 つの で構成される名前付きの「temp」が作成されましたdata.frame

temp
# $attempt.1
#      idorg  x  y
# [1,]     2 20 21
# [2,]     5 17 13
# [3,]     4 16 50
# 
# $attempt.2
#      idorg  x  y
# [1,]     5 17 13
# [2,]     1 14 31
# [3,]     3 21 20
# 
# $attempt.3
#      idorg  x  y
# [1,]     5 17 13
# [2,]     3 21 20
# [3,]     2 20 21
# 
# $attempt.4
#      idorg  x  y
# [1,]     1 14 31
# [2,]     5 17 13 
# [3,]     4 16 50

R ではリストは非常に便利です。lapply()行の合計を調べたい場合は、 を使用して、他の楽しいことを行うことができますlapply(temp, rowSums)。または、別の CSV ファイル (Excel で読み取り可能) を出力したい場合は、次のようにすることができます。

lapply(names(temp), function(x) write.csv(temp[[x]],
                             file = paste0(x, ".csv")))
于 2012-10-16T09:48:17.203 に答える