2017-06-01 5 views
0

私はRの新しいユーザーであり、データフレームの複数のサブサンプルを作成しようとしています。私は4つの階層(STRATUM = 1,2,3,4)に割り当てられたデータを持ち、各階層の指定された数の行だけをランダムに保持したい。これを達成するために、データをインポートし、階層化値でソートしてから、各行に乱数を割り当てます。将来の分析でそれらを再度使用する必要があるので、元の乱数割り当てを保持したいので、これらの値で.csvを保存します。次に、データをその階層でサブセット化し、各階層に保持するレコードの数を指定します。最後に、データに再び参加し、新しい.csvファイルとして保存します。コードは機能しますが、このプロセスを100回繰り返す必要があります。いずれの場合も、無作為に選択されたプロットの最後の.csvと同様に、割り当てられた乱数で.csvを保存します。このコードブロックを100倍にする方法と、繰り返しごとに一意のファイル名を割り当てる方法についてはわかりません。どんな助けでも大歓迎です。R - 新しい乱数とプロットの削除を使ってデータフレームの操作を100倍繰り返す方法

DataFiles <- "//Documents/flownData_JR.csv" 
PlotsFlown <- read.table (file = DataFiles, header = TRUE, sep = ",") 
#Sort the data by the stratification 
FlownStratSort <- PlotsFlown[order(PlotsFlown$STRATUM),] 
#Create a new column with a random number (no duplicates) 
FlownStratSort$RAND_NUM <- sample(137, size = nrow(FlownStratSort), replace = FALSE) 
#Sort by the stratum, then random number 
FLOWNRAND <- FlownStratSort[order(FlownStratSort$STRATUM,FlownStratSort$RAND_NUM),] 
#Save a csv file with the random numbers 
write.table(FLOWNRAND, file = "//Documents/RANDNUM1_JR.csv", sep = ",", row.names = FALSE, col.names = TRUE) 
#Subset the data by stratum 
FLOWNRAND1 <- FLOWNRAND[which(FLOWNRAND$STRATUM=='1'),] 
FLOWNRAND2 <- FLOWNRAND[which(FLOWNRAND$STRATUM=='2'),] 
FLOWNRAND3 <- FLOWNRAND[which(FLOWNRAND$STRATUM=='3'),] 
FLOWNRAND4 <- FLOWNRAND[which(FLOWNRAND$STRATUM=='4'),] 
#Remove data from each stratum, specifying the number of records we want to retain 
FLOWNRAND1 <- FLOWNRAND1[1:34, ] 
FLOWNRAND2 <- FLOWNRAND2[1:21, ] 
FLOWNRAND3 <- FLOWNRAND3[1:7, ] 
FLOWNRAND4 <- FLOWNRAND4[1:7, ] 
#Rejoin the data 
FLOWNRAND_uneven <- rbind(FLOWNRAND1, FLOWNRAND2, FLOWNRAND3, FLOWNRAND4) 
#Save the table with plots removed from each stratum flown in 2017 
write.table(FLOWNRAND_uneven, file = "//Documents/Flown_RAND_uneven_JR.csv", sep = ",", row.names = FALSE, col.names = TRUE) 

答えて

0

は、ここであなただけの各セットにあるどの行知る必要がある場合data.tableソリューションです。

library(data.table) 
df <- data.table(dat = runif(100), 
       stratum = sample(1:4, 100, replace = T)) 

# Gets specified number randomly from each strata 
get_strata <- function(df, n, i){ 
    # Subset data frame to randomly chosen w/in strata 
    # replace stratum with var name 
    f <- df[df[, .I[sample(.N, n)], by = stratum]$V1] 

    # Save as CSV, replace path 
    write.csv(f, file = paste0("path/df_", i), 
      row.names = F, col.names = T) 
} 

for (i in 1:100){ 
    # replace 10 with number needed 
    get_strata(df, 10, i) 
} 
+0

最終的な結果として、私は階層2から21行、階層3から7行、及び階層4から7行、私の元のデータ列の全てを有した.csvをしたいが、唯一の34行階層1からそれぞれの階層内のこれらの行をランダムに選択して、反復を行うたびに階層ごとに異なる行のサブセットを取得するようにします。私はこのプロセスを100回繰り返し、100個の.csvファイルを生成したい。 –

関連する問題