2016-04-27 60 views
0

循環我有此腳本:替代爲R中

x<-seq(1,5) 
y<-seq(6,10) 
z<-sample(25) 
x.range <- range(x) 
y.range <- range(y) 
df <- expand.grid(x = seq(from = x.range[1], to = x.range[2], by = 1), y = seq(from = y.range[1], 
                       to = y.range[2], by = 1)) 
df$z<-z 

x1<-c(1,2,3) 
y1<-c(6,7,8) 
z1<-c(10,12,13) 
df_1<-data.frame(x1,y1,z1) 
n<-length(df_1$x1) 
df_pred<-data.frame(0,0,0) 
names(df_pred)[1:3] <- c("x", "y", "z_pred") 

for(i in 1:n) 
{df_pred[i,]<-filter(df, x==df_1$x1[i], y==df_1$y1[i])} 
sqm <- mean((df_pred[,3]-df_1[,3])^2) 

我想計算的df_1的DF和Z1價值Z值之間的平方誤差。爲此,我使用循環來提取我需要從df開始的行,基於df_1的x1和y1值。 我問你是否有什麼不同的這個循環,做同樣的事情(使用,例如,dplyr包)。謝謝。

+0

在一個側面說明'名(df_pred)[1:3] < - C( 「Y」, 「z_pred」 「X」)'只需要是名稱(df_pred)< - c(「x」,「y」,「z_pred」)'。 – lmo

+0

你的'for'循環應該完成什麼?當我運行它時,我會遇到錯誤。 – lmo

+0

另一方面說明,看起來您已經知道df_pred data.frame的大小。在這種情況下,預分配好得多:'df_pred <-data.frame(「x」= rep(0,n),「y」= rep(0,n),「z_pred」= rep 0,n))' – lmo

回答

1

如果命名爲「x」,「y」和「Z」相似的df,然後df_1列,您可以使用

df_1 <- data.frame(x=x_1,y=y_1,z=z_1) 
library(dplyr) 
inner_join(df,df_1,by=c("x","y")) 
0

我不知道你是什麼迴路但你想嘗試這個。我用它來代替你的循環。

df_pred <- subset(df, x %in% df_1$x1 & y %in% df_1$y1) 

讓我知道這是否解決您的問題