0

私のデータフレームには、type("A"または"B")、xvar、経度、緯度の4つの列があります。次のようになります。

      type    xvar    longitude    latitude
[1,]   A       20      -87.81        40.11
[2,]   A       12      -87.82        40.12
[3,]   A       50      -87.85        40.22
....
[21,]  B       24      -87.79        40.04
[22,]  B       30      -87.88        40.10
[23,]  B       12      -87.67        40.32
[24,]  B       66      -87.66        40.44
....

type = "A"には20行、type="B"には25,000行あります。私の仕事は、20個の「A」データポイントのxvarの値を、置換せずにタイプ「B」のXY空間にランダムに割り当てることです。たとえば、type = "A"の最初の観測値のように、xvar = 20は、[22、]、つまり(-87.88,40.10)にランダムに配置できます。私はこれを置き換えなしで行っているので、理論的には、このレプリケーションを25,000 / 20=1,250回実行できます。1,000回のレプリケーションが必要です。

そして、1つのランダムサンプルから1つの統計値を返す関数(たとえば、myfunc(xvar、longitude、latitude))があります。まず、1,000x1の空行列(たとえば、myresult)を作成します。

myresult <- array(0,dim=c(1000,1))

次に、ランダムサンプルごとに、関数(myfunc)を適用して統計を計算します。

for (i in seq(1:1000)) {
  draw one sample, that has three variables: xvar, longitude, latitude.
  apply my function to this selected sample.
  store the calculated statistic in the myresult[i,]
}

Rでこれを行う方法を知りたいです(そしてMatlabにあるかもしれませんか??)ありがとう!

================================================== ===========

更新:@user。あなたのアイデアを借りて、以下は私が欲しいものです:

dd1 <- df[df$type == "B" ,] 
dd2 <- df[df$type == "A" ,]
v   <- dd2[sample(nrow(dd2), nrow(dd2)), ]
randomXvarOfA <- as.matrix(v[,c("xvar")])  
cols <- c("longitude","latitude")
B_shuffled_XY <- dd1[,cols][sample(nrow(dd1), nrow(dd2)), ]
dimnames(randomXvarOfA)=list(NULL,c("xvar"))
sampledData <- cbind(randomXvarOfA,B_shuffled_XY)
sampledData

   xvar longitude latitude
4   20    -87.79    40.04
7   12    -87.66    40.44
5   50    -87.88    40.10
4

2 に答える 2

1

あなたが探している関数は「サンプル」関数だと思います。これは次のように機能します(ループアプローチを使用):

drawn_Sample <- sample(21:25000, 20000, rep=FALSE)
myresult <- integer(1000)    

for (i in seq(1:1000){
index_Values <- (1 + (i-1)*20):(20 + (i-1)*20))
myresult[i] <- myfun(my_Data$xvar[1:20], my_Data$longitude[drawn_Sample[index_Values]], my_Data$latitude[drawn_Sample[index_Values]])
}

この場合、ランダムに選択された20行21:25000のグループに行1:20(値「A」の行)をランダムに割り当て、グループ全体に関数を適用しています。

これは少し不必要に複雑に感じます。あなたの機能(「myfun」)についてもう少し知っていれば、すべてを凝縮できると思います。私はそれがベクトル化されていると仮定しています。

更新:OPの要求に応じて、簡単に並べ替えられないデータフレームに合わせてこの回答を変更する方法を追加しています。

repetitions <- 1000 # Change this as necessary

A_data <- my_Data[my_Data$type=="A",]
B_data <- my_Data[my_Data$type=="B",]

A_rows <- nrow(A_data)
B_rows <- nrow(B_data)

drawn_Sample <- sample(1:B_rows, repetitions * A_rows, rep=FALSE)
myresult <- integer(repetitions)    

for (i in seq(1:repetitions){
index_Values <- (1 + (i-1)*A_rows):(A_rows + (i-1)*A_rows))
myresult[i] <- myfun(A_data$xvar, B_data$longitude[drawn_Sample[index_Values]], B_data$latitude[drawn_Sample[index_Values]])
}
于 2013-01-30T18:10:51.333 に答える
1

データを読み込みます。

  df<- read.table( text="
      type    xvar    longitude    latitude
      A       20      -87.81        40.11
      A       12      -87.82        40.12
      A       50      -87.85        40.22
      B       24      -87.79        40.04
      B       30      -87.88        40.10
       B       12      -87.67        40.32
      B       66      -87.66        40.44", header = TRUE)

私はこれを分割せずに書いていました、そしてそれはとても乱雑に見えました。だから私はあなたのを分割することにしましたdata.frame

    dd1 <- df[df$type == "B" ,]  # get all rows of just type A
    dd2 <- df[df$type == "A" ,]  # get all rows of just type B

    v   <- dd2[sample(nrow(dd2), 2), ] #sample two rows at random that are type A
    # if you want to sample 20 rows change the 2 to a 20

    cols <- c("longitude", "latitude")
    dd1[,cols][sample(nrow(dd1), 2), ] <- v[,cols] 
    #Add the random long/lat selected from type As into 2 random long/lat of B


# put the As and Bs back together
rbind(dd2,dd1)
#  type xvar longitude latitude
# 1    A   20    -87.81    40.11
# 2    A   12    -87.82    40.12
# 3    A   50    -87.85    40.22
# 4    B   24    -87.79    40.04
# 5    B   30    -87.85    40.22
# 6    B   12    -87.81    40.11
# 7    B   66    -87.66    40.44

ご覧のとおり、Bの行5と6には、Aタイプからランダムに選択された新しいlat値とlong値があります。xvarただし、値は変更しませんでした。これが欲しいかどうかわかりません。あなたも変更したい場合は、にxvars変更colscols <- c("xvar","longitude", "latitude")ます。

関数内では、次のようになります。

changestuff <-  function(x){

        dd1 <- x[x$type == "B" ,]  # get just A
        dd2 <- x[x$type == "A" ,]  # get just B
        v   <- dd2[sample(nrow(dd2), 2), ]
        cols <- c("longitude", "latitude")
        dd1[,cols][sample(nrow(dd1), 2), ] <- v[,cols] 
        rbind(dd2,dd1)
                            }

changestuff(df)
于 2013-01-30T18:32:49.620 に答える