2016-04-16 10 views
3

forループでは、2つの異なるデータフレームのデータをリンクする際にいくつかの問題があります。 各データフレームの一部を表示するつもりですが、これらのデータフレームの長さがはるかに大きいことを知る必要があるため、ループを使用して問題を解決する必要があります。私はここに新しいですので、私は、画像の中に置くことができないので、私はごく一部を入力して、それを明確にしようとします:計算とプリントのデータフレーム間のループ

DATAFRAME 1:

Four columns: Treenr, X, Y and d  
first row: 1, 191.5, 240, 23.93  
second row: 2, 213.5, 153.5, 8.14 

DATAFRAME 2

Three columns: Liananr, Xl, Yl  
first row: 1, 191.5, 240, 23.93  
second row: 2, 213.5, 153.5, 8.14 

XYは座標です。 dは距離です。 最終的に私はすべての里親のためにこれを計算したい:r = sqrt((Xl-X)^2+(Yl-Y)^2)。各liananrのために(5)Treenrにリンクされているので、それぞれ、これは列ごとに次のことを示します(2) 、これは10行を与える必要があります

Liananr, Treenr, r and d. 

:私は私に4列を与える新しいデータフレーム、でこれを望みます行:

row 1: 1, 1, 91.11, 23.93  
row 2: 2, 1, 73.56, 29.93  
row 3: 3, 1, 73.56, 29.93  
row 4: 4, 1, 73.56, 29.93  
row 5: 5, 1, 55.22, 23.93  
row 6: 1, 2, 53.50, 8.14  
row 7: 2, 2, 58.22, 8.14  
row 8: 3, 2, 58.22, 8.14  
row 9: 4, 2, 58.22, 8.14  
row 10: 5, 2, 74.50, 8.14 

私は、「リンクされた」新しいデータフレームを呼ぶだろうと最初に私が定義:

X <- dataframe1$X  
Y <- dataframe1$Y  
Xl <- dataframe2$Xl  
Yl <- dataframe2$Yl 

for (i in 1:length(dataframe1$Treenr) {  
    for (j in 1:length(dataframe2$Liananr) {  
    Linked$Liananr <- dataframe2$Liananr  
    Linked$Treenr <- dataframe1$Treenr  
    Linked$r <- sqrt((Xl[j,]-X[i,])^2+(Yl[j,]-Y[i,])^2)  
    Linked$d <- dataframe1$d  
    } 
} 

私の最大の問題は、私はで動作する方法がわからないということですiとjをこのループに入れます。

答えて

1

2組(つまり、cartesian product)の間のすべての組み合わせのペアを返すクロス結合の使用を検討してください。これにより、列単位で計算を処理できるため、ネストされたforループが回避されます。以下の例では、アップロードしたデータとしてdf1の数値を調整して、両方のフレームのデータを複製しました。

df1 <- data.frame(Treenr=c(1,2), 
       X=c(181.5, 206.5), 
       Y=c(230, 147.5), 
       d=c(13.93, 1.14)) 
df1$key <- 1 
df2 <- data.frame(Liananr=c(1,2), 
        X1=c(191.5, 213.5), 
        Y1=c(240, 153.5), 
        d=c(23.93, 8.14)) 
df2$key <- 1 

crossdf <- merge(df1, df2, by='key') 
crossdf 
# key Treenr  X  Y d.x Liananr X1 Y1 d.y 
# 1 1  1 181.5 230.0 13.93  1 191.5 240.0 23.93 
# 2 1  1 181.5 230.0 13.93  2 213.5 153.5 8.14 
# 3 1  2 206.5 147.5 1.14  1 191.5 240.0 23.93 
# 4 1  2 206.5 147.5 1.14  2 213.5 153.5 8.14 
crossdf$r <- with(crossdf, sqrt((X1-X)^2+(Y1-Y)^2)) 

finaldf <- crossdf[c('Liananr', 'Treenr', 'r', 'd.y')] 
names(finaldf)[4] <- 'd' 
finaldf 
# Liananr Treenr   r  d 
# 1  1  1 14.142136 23.93 
# 2  2  1 82.923157 8.14 
# 3  1  2 93.708324 23.93 
# 4  2  2 9.219544 8.14 
+0

ありがとうございます。 – Jana

+0

素晴らしい!回答が助けられた場合、解決を確認するために同意してください。 – Parfait

関連する問題