条件付き距離をループしようとしているデータフレーム内で計算しますが、ループシーケンス長を決定するときに問題が発生します。 seq_lenとlengthで試したが、両方ともNA-sのdfで終わる。元のデータはGPS座標データであり、いくつかの互いに近いGPSポイントを取り除くことを試みている。 例えば以下のようなコードがあります。
form=function(n1,n2,m1,m2){
a=n1+n2
b=m1+m2
d=a-b
return(d)
}
n=c(3,3,4,3,4,2,4,8,4,5,3)
m=c(3,2,1,3,4,5,6,8,3,4,2)
df=data.frame(n,m)
df1=df
for (i in seq_len(nrow(df1))){##same with 1:length(df1$n)
dist=form(df1$n[i], df1$m[i], df1$n, df1$m)
df1$distance<-dist
df1<-(df1[with(df1, !(distance >=1 & distance <=2)), ])
}
それは与える:
df1
n m distance
NA NA NA NA
NA.1 NA NA NA
NA.2 NA NA NA
カットアンドドライ法を使用する場合、4回の反復とループ作業があります。
for (i in 1:4)){
dist=form(df1$n[i], df1$m[i], df1$n, df1$m)
df1$distance<-dist
df1<-(df1[with(df1, !(distance >=1 & distance <=2)), ])
}
それは与える:
df1
n m distance
7 4 6 -1
8 8 8 -7
10 5 4 0
ループシーケンスの長さを誤って判断している ありがとう。
回答:
回答№1は0あなたがループの長さを定義する方法はそうではありませんNA値の本当の理由根本的な問題は、あなた自身の入力を上書きするループを持っているので、行数がループの進行と同じにならないことです。良い解決策を提供するのは難しいです。
これを試しても、NAが返されることはありませんが、探している出力かどうかはわかりません。
df1=df
for (i in 1:nrow(df)) {
dist <- form(df$n[i], df$m[i], df$n, df$m)
df$distance <- dist
df1 <- (df[with(df, !(distance >=1 & distance <=2)), ])
}
df1
# n m distance
# 1 3 3 -1
# 2 3 2 0
# 3 4 1 0
# 4 3 3 -1
# 5 4 4 -3
# 6 2 5 -2
# 7 4 6 -5
# 8 8 8 -11
# 9 4 3 -2
# 10 5 4 -4
# 11 3 2 0
回答№2の場合は0
私はあなたの "フォーム"機能が何をするのかわからないが、これはあなたを助けるかもしれない:
n=c(3,3,4,3,4,2,4,8,4,5,3)
m=c(3,2,1,3,4,5,6,8,3,4,2)
df=data.frame(n,m)
df1=df
i=1
while(i<nrow(df1)){##same with 1:length(df1$n)
dist=form(df1$n[i], df1$m[i], df1$n, df1$m)
df1$distance<-dist
df1<-(df1[with(df1, !(distance >=1 & distance <=2)), ])
i =i+1
}
結果:
n m distance
5 4 4 0
7 4 6 -2
8 8 8 -8
10 5 4 -1
回答№3の場合は-1
なぜその結果が生み出されるのか私にはわからない。 seq_len(nrow(df1))
同じ 1:11
(そしてその仕事!)
しかし、私はあなたがforループで基本的な間違いを犯すと思います。各ステップでは、 df1$distance
置き換えられます。最後に df1$distance
は、11番目の観測値とすべての観測値(自分自身を含む)の間の距離計算で埋められます。
私はあなたが距離maxtrixの種類を作成し、それから特定の値を選んでほしいと思います。
そのような距離行列は、 outer
-関数:
m <- outer(df$n + df$m, df$n + df$m, "-")
結果:
> m
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11]
[1,] 0 1 1 0 -2 -1 -4 -10 -1 -3 1
[2,] -1 0 0 -1 -3 -2 -5 -11 -2 -4 0
[3,] -1 0 0 -1 -3 -2 -5 -11 -2 -4 0
[4,] 0 1 1 0 -2 -1 -4 -10 -1 -3 1
[5,] 2 3 3 2 0 1 -2 -8 1 -1 3
[6,] 1 2 2 1 -1 0 -3 -9 0 -2 2
[7,] 4 5 5 4 2 3 0 -6 3 1 5
[8,] 10 11 11 10 8 9 6 0 9 7 11
[9,] 1 2 2 1 -1 0 -3 -9 0 -2 2
[10,] 3 4 4 3 1 2 -1 -7 2 0 4
[11,] -1 0 0 -1 -3 -2 -5 -11 -2 -4 0
これで、そこからさまざまな形の距離を抽出できます。
# average distance
rowMeans(m)
# distance sum
rowSums(m)