Skip to content

[R-es] Problema con bucle for

9 messages · Pedro Herrero Petisco, Francisco Rodríguez, Manuel Morales +3 more

#
Hola, quiero obtener la suma del producto de los elementos de un vector
y cuando construyo el código me aparecen una serie de NA que me impiden
calcular la suma. ¿Alguna sugerencia? 

El código es el siguiente: 

x<- c(24,12,45,68,45)
n<-length(x)
res<-numeric()
for(i in 1:n-1){
 for(j in i+1:n){
 res<- sum(x[i]*x[j])
 print(res)
 }
}
res
#
Puedes usar la orden is.na() que comprueba si un valor es NA o no y cuando
lo sea hacer que pase al siguiente paso del bucle. Algo así:

x<- c(24,12,45,68,NA,45)
n<-length(x)
res<-numeric()
for(i in c(1:n)){
print(i)
print(x[i])
 if (is.na(x[i])) next
 for(j in c(i+1:n)){
 if (is.na(x[j])) next
  res<- sum(x[i]*x[j])
 print(res)
 }
}
res

Espero que te sirva :-)

El 24 de febrero de 2015, 10:02, <morales en us.es> escribió:

  
  
#
Si he entendido bien el problema, lo que quieres hacer realmente es esto:
x<- c(24,12,45,68,45)n<-length(x)res=0for(i in 2:n-1){  for(j in (i+1):n){    res<- res + (x[i]*x[j])    print(res)  }}
Cuya salida es:
[1] 288[1] 1368[1] 3000[1] 4080[1] 4620[1] 5436[1] 5976[1] 9036[1] 11061[1] 14121
Varias observaciones:
1:n-1 define un vector que empieza en 0, cuando la posición 1 en R es el 1 por tanto x[0] no existe y no da resultado
sum(x[i]*x[j])  es una operación que calcula la suma de un vector, en tu caso tienes un escalar y por tanto no debería hacer nada
Tienes que definir res para que se sume así misma
Un saludo 
Francisco J.

  
  
#
Muchas gracias por la solución. 

El 24/02/2015 10:36, Francisco Rodríguez escribió:

  
  
#
Hola,

Otra forma de hacerlo, es así:

#---------------
[1] 14121
#---------------

Y te ahorras los líos del bucle y de los índices...

Saludos,
Carlos Ortega
www.qualityexcellence.es

El 24 de febrero de 2015, 10:36, Francisco Rodríguez <fjroar en hotmail.com>
escribió:

  
    
#
O solo

R> sum(combn(x, 2, prod))
[1] 14121

Saludos,
Jorge.-


2015-02-24 21:00 GMT+11:00 Carlos Ortega <cof en qualityexcellence.es>:

  
  
#
En mi opinión en R siempre es preferible soluciones como la de Carlos, al ser una operación vectorial, todo es muchísimo más rápido, de este modo si tu vector fuese muy grande, mi solución sería lenta pero imagino que la de Carlos sería bastante rápida
Un saludo

Date: Tue, 24 Feb 2015 11:00:26 +0100
Subject: Re: [R-es] Problema con bucle for
From: cof en qualityexcellence.es
To: fjroar en hotmail.com
CC: morales en us.es; r-help-es en r-project.org

Hola,

Otra forma de hacerlo, es así:

#---------------
[1] 14121
#---------------

Y te ahorras los líos del bucle y de los índices...

Saludos,
Carlos Ortega
www.qualityexcellence.es

El 24 de febrero de 2015, 10:36, Francisco Rodríguez <fjroar en hotmail.com> escribió:
Si he entendido bien el problema, lo que quieres hacer realmente es esto:

x<- c(24,12,45,68,45)n<-length(x)res=0for(i in 2:n-1){  for(j in (i+1):n){    res<- res + (x[i]*x[j])    print(res)  }}

Cuya salida es:

[1] 288[1] 1368[1] 3000[1] 4080[1] 4620[1] 5436[1] 5976[1] 9036[1] 11061[1] 14121

Varias observaciones:

1:n-1 define un vector que empieza en 0, cuando la posición 1 en R es el 1 por tanto x[0] no existe y no da resultado

sum(x[i]*x[j])  es una operación que calcula la suma de un vector, en tu caso tienes un escalar y por tanto no debería hacer nada

Tienes que definir res para que se sume así misma

Un saludo

Francisco J.

        

            

        
        
_______________________________________________

R-help-es mailing list

R-help-es en r-project.org

https://stat.ethz.ch/mailman/listinfo/r-help-es
#
Muchas gracias de nuevo por las soluciones aportadas. 

El 24/02/2015 11:10, Jorge I Velez escribió:
Links:
------
[1] http://www.qualityexcellence.es
[2] https://stat.ethz.ch/mailman/listinfo/r-help-es
#
Prueba esto:

x<- c(24,12,45,68,45)
tmp <- outer(x, x, "*")
sum(tmp[lower.tri(tmp)])

Un saludo,

Carlos J. Gil Bellosta
http://www.datanalytics.com






El día 24 de febrero de 2015, 10:02,  <morales en us.es> escribió: