2017-09-05 4 views
0

J'essaye de remplacer toutes les valeurs de r pour lesquelles r < = 10 avec la valeur de la 1ère observation dans x (qui est 1). Ceci est juste un exemple très simplifié de ce que j'essaie de faire, donc s'il vous plaît ne vous demandez pas pourquoi j'essaie de le faire d'une manière compliquée parce que le code complet est plus compliqué. La seule chose pour laquelle j'ai besoin d'aide est de comprendre comment utiliser le vecteur que j'ai créé (p1) pour remplacer r [p1] ou de manière équivalente r [c (1,2,3,4)] avec x [1] (qui est égal à 1). Je ne peux pas écrire p1 explicitement car il sera généré dans une boucle (non montrée dans le code).R: Appelle un nom de variable collé et l'utilise comme argument de position

x=c(1,2,3) 
r=c(1,3,7,10,15) 
assign(paste0("p", x[1]), which(r<=10)) 
p1 
r[paste0("p", x[1])]=x[1] 

Dans le code ci-dessus, j'ai essayé d'utiliser r[paste0("p", x[1])]=x[1] mais c'est la sortie je me retrouve avec enter image description here

Au contraire, quand je voudrais voir cette sortie enter image description here

Fondamentalement, je dois trouver un moyen d'appeler p1 dans ce code r[??]=x[1] sans taper p1 explicitement.

J'ai inclus le code complet que je tente ci-dessous dans le cas où un contexte est nécessaire.

##Creates a function to generate discrete random values from a specified pmf 
##n is the number of random values you wish to generate 
##x is a vector of discrete values (e.g. c(1,2,3)) 
##pmf is the associated pmf for the discrete values (e.g. c(.3,.2,.5)) 
r.dscrt.pmf=function(n,x,pmf){ 
    set.seed(1) 
    ##Generate n uniform random values from 0 to 1 
    r=runif(n) 
    high=0 
    low=0 
    for (i in 1:length(x)){ 
     ##High will establish the appropriate upper bound to consider 
     high=high+pmf[i] 
     if (i==1){ 
      ##Creates the variable p1 which contains the positions of all 
      ##r less than or equal to the first value of pmf 
      assign(paste0("p", x[i]), which(r<=pmf[i])) 
     } else { 
      ##Creates the variable p2,p3,p4,etc. which contains the positions of all 
      ##r between the appropriate interval of high and low 
      assign(paste0("p", x[i]), which(r>low & r<=high)) 
     } 
     ##Low will establish the appropriate lower bound to consider 
     low=low+pmf[i] 
    } 
    for (i in 1:length(x)){ 
     ##Will loops to replace the values of r at the positions specified at 
     ##p1,p2,p3,etc. with x[1],x[2],x[3],etc. respectively. 
     r[paste0("p", x[i])]=x[i] 
    } 
    ##Returns the new r 
    r 
} 
##Example call of the function 
r.dscrt.pmf(10,c(0,1,3),c(.3,.2,.5)) 
+1

Vous feriez mieux de créer une liste. 'myList <- list()'. Ensuite, dans votre boucle 'for', remplacez des lignes comme' assign (paste0 ("p", x [i]), qui (r <= pmf [i])) 'avec myList [[paste0 (" p ", x [ i])]] <- r <= pmf [i] '. Vous n'avez pas besoin du 'which' sauf si vous modifiez directement l'index. Pour la plupart des problèmes, le vecteur logique sera préférable. – lmo

+1

Il semblerait aussi que vous puissiez utiliser 'mapply' ou' Map' à la place de votre boucle 'for' pour retourner directement la liste, mais c'est une autre question. – lmo

Répondre

3

get est comme assign, en ce qu'il vous permet de vous référer aux variables par chaîne au lieu du nom.

r[get(paste0("p", x[1]))]=x[1] 

Mais get est l'un de ces « drapeaux » de quelque chose qui pourrait être écrit d'une manière beaucoup plus claire et plus sûre.

2

Cela vous convient-il?

ifelse(r<11, x[1], r) 
[1] 1 1 1 1 15