Ich versuche zu verstehen, die Arbeit von for-Schleife für einen Vektor in R. Ich habe die Lösung für mein Problem, aber mit einem Zweifel über seine grundlegende Arbeit.Wie funktioniert die For-Schleife für einen Vektor in R?
Bei der Erstellung einer Funktion stieß ich auf dieses Problem. Das Problem ist, dass die for-Schleife die Elemente des Vektors durchläuft, aber bis zu einem bestimmten Index.
## the output is partially complete, seems like it didn't loop through all the values however the loop counter is perfect
temp_vector<- c(1, NA,Inf, NaN,3,2,4,6,4,6,7,3,2,5,NaN, NA, 3,3,NaN, Inf, Inf, NaN, NA, 3,5,6,7)
ctr<- 0
for(i in temp_vector){
temp_vector[i]<- ifelse((!is.na(temp_vector[i])) & (!is.infinite(temp_vector[i])), temp_vector[i], 0 )
## replace the element of vector by 0 if they are Inf or NA or NaN
ctr<- ctr+1
}
temp_vector
print(ctr)
# output
> temp_vector
[1] 1 0 0 0 3 2 4 6 4 6 7 3 2 5 NaN NA 3 3 NaN Inf Inf NaN NA 3 5 6 7
> print(ctr)
[1] 27
## this is generating correct output
temp_vector<- c(1, NA,Inf, NaN,3,2,4,6,4,6,7,3,2,5,NaN, NA, 3,3,NaN, Inf, Inf, NaN, NA, 3,5,6,7)
for(i in 1:length(temp_vector)){
temp_vector[i]<- ifelse((!is.na(temp_vector[i])) & (!is.infinite(temp_vector[i])), temp_vector[i], 0 )
## replace the element of vector by 0 if they are Inf or NA or NaN
}
temp_vector
# output
> temp_vector
[1] 1 0 0 0 3 2 4 6 4 6 7 3 2 5 0 0 3 3 0 0 0 0 0 3 5 6 7
Im Folgenden sind einige Varianten für Schleifen, die ich versuchte, die unterschiedlichen Ausgänge erzeugen, ich versuche zu verstehen, wie es funktioniert im Grunde. Es wäre hilfreich, wenn Sie etwas Licht darauf werfen könnten. Vielen Dank!
## variant-0
y <- c(2,5,3,9,8,11,6)
count <- 0
for (val in y) {
if(val %% 2 == 0)
count = count+1
}
print(count)
# output
[1] 3
## variant-1
x<- c(2,4,6,4,6,7,3,2,5,6)
for(i in x){
x[i]<- ifelse(x[i]==6, NaN, x[i])
}
x
# output, Last element of the vector is not a NaN
[1] 2 4 NaN 4 NaN 7 3 2 5 6
## variant-2
x<- c(2,4,6,4,6,7,3,2,5,6)
ctr<- 0
for(i in x){
x[i]<- ifelse(x[i]==6, NaN, x[i])
ctr<- ctr+1
}
x
print(ctr)
# output, Note: Last element of the vector is not a NaN
> x
[1] 2 4 NaN 4 NaN 7 3 2 5 6
> print(ctr)
[1] 10
## variant-3
x<- c(2,4,6,4,6,7,3,2,5,6)
ctr<- 0
for(i in x){
x[ctr]<- ifelse(x[ctr]==6, NaN, x[ctr])
ctr<- ctr+1
}
x
print(ctr)
# output. Note: the counter is perfect
> x
[1] 2 4 NaN 4 NaN 7 3 2 5 6
> print(ctr)
[1] 10
## variant-4
x<- c(2,4,6,4,6,7,3,2,5,6)
ctr<- 0
for(i in x){
i<- ifelse(i==6, NaN, i)
ctr<- ctr+1
}
x
print(ctr)
# output
> x
[1] 2 4 6 4 6 7 3 2 5 6
> print(ctr)
[1] 10
, dass ein gültiges Konzept ist und ich weiß, Dies, aber ein Problem, wenn Sie die ersten zwei Chunks ausführen, ist es nicht durch alle Elemente im ersten Teil, aber funktioniert gut bis zu einem bestimmten Index dafür. – freetiger
Ihre erste Schleife 'for (i in temp_vector)' führt eine Schleife über die Elemente des Vektors 'temp_vector'. Sie verwenden dann "i", um auf Teile Ihres Vektors zuzugreifen, z. hier '! is.na (temp_vector [i])'. In der ersten Iteration ist alles in Ordnung, weil "i = 1", aber in der zweiten Iteration "i = NA" und Sie verwenden "i" mehrmals, um auf Teile Ihres Vektors zuzugreifen, sollten Sie stattdessen den entsprechenden Index verwenden. – rhole
das ist richtig! Vielen Dank! Akzeptiert! – freetiger