/ / for-loopは、seq_lenまたはrの長さを使用してNAをデータフレームに生成します - r、loops、forループ、dataframe

Forループは、r - r、ループ、for-loop、dataframeのseq_lenまたはlengthを使用してデータフレームにNAを生成します。

条件付き距離をループしようとしているデータフレーム内で計算しますが、ループシーケンス長を決定するときに問題が発生します。 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)