Foro de debate

Crear nuevos elementos cambiando ciertas letras del código

Crear nuevos elementos cambiando ciertas letras del código

de Joan Fernando Lamprea Huertas -
Número de respuestas: 1

Hola, buen día. 
Tengo una pequeña duda: deseo hacer una función que genere nuevos valores, cambiando ciertos caracteres de la misma; es decir, en el siguiente código:

library(combinat)
hoteles=c("A","B","C","D","E")
choose(5,3)
muestrasMAS=t(as.matrix(combn(hoteles,3)))
dim(muestrasMAS)
muestrasMAS
probmuestra<-c(6/90,7/90,8/90,8/90,9/90,10/90,9/90,10/90,11/90,12/90)
I(muestrasMAS=="A")
IA=rowSums(I(muestrasMAS=="A"))
IA
IB=rowSums(I(muestrasMAS=="B"))
IC=rowSums(I(muestrasMAS=="C"))
ID=rowSums(I(muestrasMAS=="D"))
IE=rowSums(I(muestrasMAS=="E"))
muestrasMAS=data.frame(muestrasMAS,probmuestra,IA,IB,IC,ID,IE)
muestrasMAS
muestrasMAS$ns=rowSums(muestrasMAS[,5:9])
muestrasMAS
attach(muestrasMAS)
piA=sum(IA*probmuestra)
piA
var=piA*(1-piA)*(9/10)
var
piAB=sum(IA*IB*probmuestra)

 

Quiero cambiar las letras "A" y "B" de "piAB", e "IA" e "IB", en la última línea, por las que están en el vector "hoteles", sin repetición, para un total de 10 sentencias (piAC=sum(IA*IC*probmuestra), piAD=sum(IA*ID*probmuestra), piAE=sum(IA*IE*probmuestra), piBC, etc) ejecutables. Intenté el siguiente código:

for (i in hoteles){
 for (j in hoteles){
  if (i!=j)
  print(pi[i][j]\=sum(I[i]*I[j]*probmuestra))
 }
}

Pero me arroja el siguiente error:


Error: unexpected '=' in:
" if (i!=j)
print(pi[i][j]="
> }
Error: unexpected '}' in " }"
> }
Error: unexpected '}' in "}

 

Me gustaría que, por favor, me indicaran que está mal como tal con el código que propuse y, si conocen una alternativa para lo que quiero intentar, les agradecería bastante que me la compartieran.

Quedo atento a sus comentarios. 

Saludos.

En respuesta a Joan Fernando Lamprea Huertas

Re: Crear nuevos elementos cambiando ciertas letras del código

de Manuel Muñoz Márquez -

Buenas, Joan:

  1. Una primera cuestión es sobre el uso de print. La función print no admite como argumentos varios objetos a imprimir. Si se deben imprimir varias cosas se debe usar una función print para cada una de ellas. Además añade un retorno de línea al final automáticamente al final de cada salida.
    La función cat permite imprimir varias cosas de una vez, siempre que sean de tipos simples. Por otra parte, los retornos de línea deben añadirse explícitamente usando la cadena "\n".
  2. Por otro lado, en R, cuando se aplica el operador * a dos vectores el resultado es un vector cuyos elementos son el producto de los elementos de los dos uno a uno. ¿Es esto lo que quieres calcular? Si quieres usar el producto matricial de vectores el operador es %*%
  3. Dado que has definido IA no puedes acceder a I['A']. Puesto que lo primero, IA es una variable, mientras que la variable I no está definida. Esto tiene al menos dos posibles soluciones, una es definir la variable, que sería un vector, con sus respectivos índices en hoteles o la que te propongo abajo.

No estoy seguro de si lo que quieres calcular es lo que he puesto, pero tal vez te sirva para encontrar el modo de hacerlo.

for (i in hoteles) {
    for (j in hoteles){
        pi <- get(paste0('I', i))
        if (i!=j) {
            pj <- get(paste0('I', j))
            cat("pi[", i, "][", j, "] =", sum(pi*pj*probmuestra), "\n")
        }
    }
}

Un saludo