主な問題は、あなたが扱っているということですx
は、インデックス作成時に配列のようなオブジェクトとして表示されます。私。 x[element]
を使用する必要がある場合は、x[row, col]
インデックスを使用しています。
結果を挿入する際には、df1$diff
にもインデックスを設定する必要があります。ユークリッド距離方程式が間違っています。差を2乗して差し引く必要はありません。
df1 <- data.frame(list(x = 1:5, y = (1:5)^2, z = 6:10))
df1$diff <- NA
for (i in 2:nrow(df1)) {
df1$diff[i] <- with(df1, sqrt((x[i] - x[i-1])^2 +
(y[i] - y[i-1])^2 +
(z[i] - z[i-1])^2))
}
> df1
x y z diff
1 1 1 6 NA
2 2 4 7 3.316625
3 3 9 8 5.196152
4 4 16 9 7.141428
5 5 25 10 9.110434
あなたはRは、要素ごとの操作を行うに依存しているため、単一のステップでこれを行うことができ、このかかわらずのためのループを必要としません:
df1 <- data.frame(list(x = 1:5, y = (1:5)^2, z = 6:10))
df1$diff <- c(NA, sqrt(rowSums((df1[-1, 1:3] - df1[-5, 1:3])^2)))
df1
> df1
x y z diff
1 1 1 6 NA
2 2 4 7 3.316625
3 3 9 8 5.196152
4 4 16 9 7.141428
5 5 25 10 9.110434
おそらくよ実際の問題が大きい場合は、データフレームが非常に遅いため、df1
をマトリックスに強制したいと考えています。
m1 <- as.matrix(df1[, 1:3])
m1 <- cbind(m1, diff = c(NA, sqrt(rowSums((m1[-1, 1:3] - m1[-5, 1:3])^2))))
> m1
x y z diff
[1,] 1 1 6 NA
[2,] 2 4 7 3.316625
[3,] 3 9 8 5.196152
[4,] 4 16 9 7.141428
[5,] 5 25 10 9.110434
あなたはあなたが元のデータが持っているどのように多くの行を心配する必要はdo't head()
とtail()
を使用して関数にこれをラップすることができます:ここでは
myEuc <- function(x) {
if (isdf <- is.data.frame(x)) {
x <- data.matrix(x)
}
dij <- c(NA, sqrt(rowSums((tail(x, -1) - head(x, -1))^2)))
x <- cbind(x, diff = dij)
if (isdf) {
x <- as.data.frame(x)
}
x
}
df1 <- data.frame(list(x = 1:5, y = (1:5)^2, z = 6:10))
myEuc(df1)
> myEuc(df1)
x y z diff
1 1 6 NA
[2,] 2 4 7 3.316625
[3,] 3 9 8 5.196152
[4,] 4 16 9 7.141428
[5,] 5 25 10 9.110434
おそらく 'sqrt(abs(Reduce( ' - '、lapply(df1、function(x)(x-デフォルト= x [1]))^ 2))))'または 'c (abs(Reduce( ' - '、as.data.frame((sapply(df1、diff))^ 2)))))) ' – akrun