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
Au contraire, quand je voudrais voir cette sortie
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))
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
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