1

データをサブセット化しようとしているときに問題に直面しています。助けてください。この列の値が2番目のデータフレームの列の値と等しい場合、最初のデータフレームのデータを列でサブセット化する必要があります。

以下は、私が使用しているデータフレームです。

> head(places)
  Zona   Poble     lat       lon      alt
1    1  Zorita 40.7353 -0.165748  691.867
2    1 Morella 40.6287 -0.113284  955.719
3    1 Forcall 40.6621 -0.209759  753.882
4    2 Benasal 40.3943 -0.126111  848.171
5    2    Cati 40.4532  0.060409  667.610
6    2  Fredes 40.7079  0.167981 1194.730

> head(data)
      date   time stat_id     lat     lon    tempc
1 20121122 000000       1 40.7353 -0.1657  7.98737
2 20121122 000000       2 40.6287 -0.1133  6.49903
3 20121122 000000       3 40.6621 -0.2098  7.72955
4 20121122 000000       4 40.3943 -0.1261  7.98837
5 20121122 000000       5 40.4532  0.0604 10.35480
6 20121122 000000       6 40.7079  0.1680  6.00769

ご覧のとおり、データフレーム「places」の最初の 3 つの場所は Zona == 1 に属し、緯度/経度をデータフレーム「data」の最初の 3 つの行と共有しています。place.dat の Zona == i と緯度/経度を共有するデータの行を選択したいと考えています。

私が試しているRスクリプトは

datos=read.table("data.dat",header=T)
places=read.table("places.dat",header=T)

data=as.data.frame(datos)
place=as.data.frame(pobles)

data$time[data$time == 0] = "000000"

subset(data,data$lat == place$lat[place$Zona == 1])

したがって、サブセットは data.dat で毎回 3 つの行を表示しますが、次のように 3 つのうち 2 つだけを選択しています。

> subset(data,data$lat == place$lat[place$Zona == 1])
         date   time stat_id     lat     lon    tempc
1    20121122 000000       1 40.7353 -0.1657  7.98737
2    20121122 000000       2 40.6287 -0.1133  6.49903
385  20121122  30000       1 40.7353 -0.1657  7.00632
386  20121122  30000       2 40.6287 -0.1133  4.83684
769  20121122  60000       1 40.7353 -0.1657  6.55283
770  20121122  60000       2 40.6287 -0.1133  4.85467
1153 20121122  90000       1 40.7353 -0.1657  6.35216
1154 20121122  90000       2 40.6287 -0.1133  5.66342
1537 20121122 120000       1 40.7353 -0.1657 11.47750
1538 20121122 120000       2 40.6287 -0.1133 10.30310
1921 20121122 150000       1 40.7353 -0.1657 13.87090
1922 20121122 150000       2 40.6287 -0.1133 11.90640
2305 20121122 180000       1 40.7353 -0.1657 10.30840
2306 20121122 180000       2 40.6287 -0.1133  7.61322
2689 20121122 210000       1 40.7353 -0.1657  6.29745
2690 20121122 210000       2 40.6287 -0.1133  6.63173
3073 20121123 000000       1 40.7353 -0.1657  4.78633
3074 20121123 000000       2 40.6287 -0.1133  5.31070
3457 20121123  30000       1 40.7353 -0.1657  6.84001
3458 20121123  30000       2 40.6287 -0.1133  6.88369
3841 20121123  60000       1 40.7353 -0.1657  5.71790

確かに何かが足りないのですが、助けてもらえますか? 任意のアイデアやヒントをいただければ幸いです。

ありがとう

データファイルは次の場所から入手できます。

編集 @ARからの回答に続いて、このコードを試してデータを選択しましたが、それが正確な方法であるかどうかはわかりません。

for(i in 1:128) {
  for(j in 1:2) {
    a=sqrt((place$lat[i]-datos$lat[j])^2+(place$lon[i]-datos$lon[j])^2)
    n=which.min(a)
    while(n <= 9344) {
      b=cbind(i,n,datos$tempc[n],place$Zona[i])
      n=n+128
    }
  }
}

そして得る:

> b
       i    n           
[1,] 128 9217 10.1198 30

最後の i 値の値だけを提供します。すべて保存したいと思います。確かに基本的なことですが、理解できません。私は経験豊富な R ユーザーではないので、しばらくお待ちください。再度、感謝します

4

1 に答える 1

2

まず、 lon の小数点以下を 4 桁丸める必要があります。おそらく、これが問題を抱えている理由です。

places=read.table("places.dat",header=T)
places=round(places$lon,digits=4)


datos[which((datos$lat==places$lat & datos$lon==places$lon) & places$Zona==1),]

この条件の結果は合計 146 ポイントです。

編集 1 (Sean のコメントに従って)

私の回答では、緯度は丸みを帯びていて、丸みを帯びていない場所があると想定していました。

しかし、Sean が指摘したように、float を比較するのは得策ではありません。各場所のポイントとdatosポイントの間の距離を計算し、一致するものとして、最小距離 (たとえば、datosのポイント間の距離の半分) よりも小さい距離を持つものを選択することをお勧めします。

編集 2

次のようなことを試してください:

b=matrix(nrow=dim(places)[1],ncol=5)
a=c()
data.p=c()
n=c()
for(i in 1:dim(places)[1]) {
  for(j in 1:dim(data)[1]) {
    a[j]=sqrt((places$lat[i]-data$lat[j])^2+(places$lon[i]-data$lon[j])^2)
  }   
  data.p[i]=which.min(a)
  n[i]=min(a)
}
b=cbind(places=1:(dim(places)[1]),data=data.p,distance=n,tempc=data$tempc[data.p],Zona=places$Zona)

いくつかのクエリを実行するよりも:

b[which(b[,3]<1),]
b[which(b[,3]<0.00001),]
于 2012-11-26T16:09:41.650 に答える