Foro de debate

for e in range en R

for e in range en R

de Josep Llasdf -
Número de respuestas: 5

Saludos!

Estoy cursando un proyecto de analisi de los nitratos de las aguas de diferentes fuentes de agua. En ello tengo una tabla con los municipios y con las concentraciones de nitratos de los años respectivos.

El caso es que quiero hacer un for e in range de cada año para poder tratar sus estadísticos.

 

for (i in 1:length(Nomcol)) {
  nombr<-tapply(((Nitrats_bo$Nomcol[i])), list(ASDF=Nitrats_bo$Municipi), mean, na.rm=TRUE)
  nombr
  write.table(nombr, "C:/Users/JOSEP/Documents/UNI/Estadística Nitrats/Estadistica/Nitrats/mydata.txt", sep="\t")
  nombr<-c()

}

Nitrats_bo son los datos, donde cada fila contiene el municipio y la concentración de nitratos de cada año.

Nomcol son los años, los quales he sacado de con colnames(Nitrats_bo) sacando los dos primeros valores: [1] "X1988", "X1989", ... 


El caso es que me da error (arguments must have the same length), igual que se refleja en el ejemplo:

Nomcol[3]
#[1] "X1990"
a<-Nomcol[3]
a
#[1] "X1990"
Nitrats_bo$a
#NULL
Nitrats_bo$Nomcol[3]
#NULL
Nitrats_bo$"X1990"
#DF de 1990
Nitrats_bo$X1990
#DF de 1990


No lee el nombre del año si se tira des de una variable pero sí si lo escrivo directamente. Algun consejo para solucionarlo, para poder usar for e in range en cada columna? 


Luego, para almacenar el conjunto de datos... algun consejo rapido?


Muchissimas gracias a todo el mundo :) (y perdonen mis moléstias)


Josep

En respuesta a Josep Llasdf

Re: for e in range en R

de Manuel Muñoz Márquez -

Buenas:

No llego a entender cuál es tu problema, pero creo que te estás complicando mucho.

El conjunto de datos Chlle tiene una variable ingresos (income) y otra sexo (sex), si quiero resumir por sexos basta:

library(car)

data(Chile)

by(Chile$income, Chile$sex, summary)

Chile$sex: F
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max.    NA's
   2500    7500   15000   32040   35000  200000      50
------------------------------------------------------------
Chile$sex: M
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max.    NA's
   2500   15000   15000   35790   35000  200000      48

O calcular la media:

by(Chile$income, Chile$sex, mean, na.rm = T)

Chile$sex: F
[1] 32041.01
------------------------------------------------------------
Chile$sex: M
[1] 35791.44

Saludos

En respuesta a Manuel Muñoz Márquez

Re: for e in range en R

de Josep Llasdf -

Muchas gracias Manuel, 

el caso es que queria hacer eso que has dicho, un summary, mean... y demás pruevas estadísticas, en 26 años diferentes, y en unos 50 municipios diferentes. 

Aplicando tapply consigo hacer mean de un año cada municipio, pero para poder hacerlo de cada año tengo que hacer el tapply en un for e in range, tal que tengo que tirar dentro de tal algoritmo una variable que contenga los año (Nomcol), pero no me deja, da NULL, porque la variable no está escrita, lo qual se refleja en el segundo script.



Josep

En respuesta a Josep Llasdf

Re: for e in range en R

de Manuel Muñoz Márquez -

Buenas:

El problema es que lo que mandas no es reproducible y tampoco explicas tu objetivo, entonces es muy difícil ayudarte.

¿Qué tal si usas las columnas por su número en vez de por su nombre?

Pero si lo que pretendes es hacer una prueba ¿con qué objetivo calculas a mano la medias?

Saludos.

En respuesta a Manuel Muñoz Márquez

Re: for e in range en R

de Josep Llasdf -

Si, buena idea, no havia caído.


E aquí s'cript:


nombr1<-c()

for (i in 3:length(Nomcol)+2) {
  nombr<-tapply(((Nitrats_bo[,i])), list(AAS=Nitrats_bo$Municipi), mean, na.rm=TRUE)
  print(nombr)
}


Ahora lo que no sé es como definir un nombre de variable diferente para cada año para poderlo integrar en el  df.... pero por lo pronto el primer problema está resuelto.


gracias,





Josep

En respuesta a Josep Llasdf

Re: for e in range en R

de Josep Llasdf -

LO ENCONTRÉEEEEEEEEEEEEEEEEEEEEEE


al cabo de un buen rato...    (.-.)

E aqui l'script: (en catalajajaja)


########################################  Via cbind  #######################

#El que es fa es fer un df de la mitja de cada municipi (tapply), llavors s'ajunta a CB (cbind).

#llavors es canvia el nom de les columnes pel que ja definit Nomcol.


CB<-c()

for (i in 3:(length(Nomcol)+2)) {

  print(Nomcol[i-2])

  nombr<-tapply(((Nitrats_bo[,i])), (list=(Nitrats_bo$Municipi)), mean, na.rm=TRUE)

  for (e in 1:length(nombr)){

    nombr[e]<-gsub("[[:punct:]]", ",", nombr[e])

  }

  CB<-cbind(CB, nombr)

  colnames(CB)[i-2]=Nomcol[i-2]

  print(i)

  nombr<-c()

}

Municipis<-levels(Nitrats_bo$Municipi)

CB<-cbind(CB,Municipis)

CB

colnames(CB)


write.csv2(CB, file="Mean69.csv", row.names = FALSE)


?write.csv2

?cbind()



Saludos ;)