gpt4 book ai didi

r - 带有计算和打印的数据帧之间的循环

转载 作者:行者123 更新时间:2023-12-02 03:16:37 25 4
gpt4 key购买 nike

我在使用 for 循环时遇到了一些困难,我想用它来链接来自 2 个不同数据帧的数据。
我将展示每个数据帧的一部分,但您需要知道这些数据帧的长度要大得多,因此我需要使用循环来解决我的问题。我不能放图片,因为我是新来的,所以我会尝试通过输入一小部分来清楚说明:

数据框 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

数据框 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) .我希望在一个新的数据框中使用它,它给了我 4 列:
Liananr, Treenr, r and d.

这应该给出 10 行,因为对于链接到 Treenr (2) 的每个 liananr (5)
这分别为每一列提供了以下行:
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。

最佳答案

考虑使用返回两个集合之间所有组合配对的交叉连接(即, 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

关于r - 带有计算和打印的数据帧之间的循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36669436/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com