2016-04-27 8 views
0

i habe dieses Skript:Alternative zu for-Schleife in 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) 

Ich mag den quadratischen Fehler zwischen dem Z-Wert von df und z1 Wert von df_1 berechnen. Um dies zu tun, benutze ich eine Schleife für die Extraktion der Zeilen, die ich von df brauche, basierend auf x1 und y1 Werten von df_1. Ich frage Sie, ob es etwas anderes für diese for-Schleife gibt, um das gleiche zu tun (zB mit dplyr-Paket). Vielen Dank.

+0

Auf einer seitlichen Anmerkung 'Namen (df_pred) löst [1: 3] <- c ("x", "y", "z_pred")' nur muss 'names (df_pred) <- c (" x "," y "," z_pred ")' sein. – lmo

+0

Was soll deine 'for' Schleife erreichen? Wenn ich es laufe, bekomme ich Fehler. – lmo

+0

Auf einer zweiten Randnotiz scheint es, dass Sie bereits die Größe Ihres df_pred data.frame kennen. In dieser Situation ist es viel besser, sie vorher zuzuweisen: 'df_pred <-data.frame (" x "= rep (0, n)," y "= rep (0, n)," z_pred "= rep (0, n)) ' – lmo

Antwort

1

Wenn Sie Spalten von df_1 als „x“, „y“ und „z“ ähnlich wie df nennen, dann können Sie

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

verwenden Ich bin nicht sicher, was ist Ihre Schleife für noch wollen Sie versuchen, Dies. Ich benutze es, um deine Schleife zu ersetzen.

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

Lassen Sie mich wissen, wenn es Ihr Problem