2009-10-25 13 views
5

estoy usando el paquete de R's stats y me gustaría bucle a través de column[x] en all the rows of a dataframe, operar en los datos en each cell en la columna con una función y pasar el resultado a una nueva columna (con la calculated result en la new column alineado con los datos en column[x])en bucle a través de una columna en R

tengo dos problemas:

  1. no puedo conseguir que funcione
  2. bucle parece estar desanimado en el R articles He leído. ¿Hay un enfoque alternativo y si no, alguien tiene un ejemplo de cómo llevar a cabo el ciclo?
+0

¿Puede darnos más detalles? ¿Como un problema de ejemplo con el que estás trabajando? – ariddell

+2

Looping no necesariamente se desaconseja. Haz que funcione primero, y solo entonces piensa en llegar más rápido. –

Respuesta

8

Sin ningún ejemplo, es difícil saber cómo responder. El caso básico de lo que usted describe, sin embargo, es la siguiente:

#Just a very simple data frame 
dat <- data.frame(x = c(1, 2, 3)) 
#Compute the squared value of each value in x 
dat$y <- dat$x^2 
#See the resultant data.frame, now with column y 
dat 

Cuando cuentas R al cuadrado un vector (o estructura vector, como, como dat $ x), se sabe que al cuadrado cada valor separado . No es necesario realizar un bucle explícito sobre esos valores la mayor parte del tiempo, aunque, como observa Dirk, solo debería preocuparse por optimizar sus bucles si le causan problemas. Dicho esto, sin duda prefiero la lectura y la escritura

dat$y <- dat$x^2 

a:

for(i in 1:length(dat$x)){ 
    dat$y[i] <- dat$x[i]^2 
} 

... siempre que sea posible.

+0

Gracias. Puedo hacer que la aritmética funcione bien. No puedo pasar el contenido de un marco de datos a una función. Este es el problema. Aquí está la parte superior del marco (llamadas de datos) con el "compuesto" y "partidas" SMILES (sonrisas son una representación de texto de una molécula) ID_Compuesto SMILES 12345 c1cccccc1 Quiero usar los parse.smiles() para Lee en las sonrisas y saca una molécula. Si lo hago en una molécula, está bien (basura <- "c1ccccc1", análisis.sonrisas (basura) Si hago sp <- get.smiles.parser() basura <- sapply ($ data sonrisas, parse.smiles, analizador = sp) no puede interpretar sonrisas – Andy

+0

bien. Lo siento, no estaba muy seguro de dónde estabas en R, así que pensé en arrojar el caso básico por ahí. "desconocido" podría tenerlo, pero si no, su mejor opción es publicar un pequeño conjunto de datos de muestra y la función. Es difícil comprender qué es lo que falla de una descripción, y yo, al menos, no puedo obtener ninguna * aplicación de funciones sin experimentación. –

1

si parse.smiles() es una función que desea aplicar a toda la entrada de un vector "vec", entonces usted puede utilizar:

lapply(1:length(vec),parse.smiles(vec[i])) 
+2

Gracias a todos. La columna que me interesó fue leída como un factor. Tenía que decir explícitamente a la función que lea en los contenidos como personajes y no me había dado cuenta de esto hasta que me lo indicaron. Ahora está funcionando. (y disculpas por los comentarios ilegibles anteriores). Se formatearon con declaraciones que desaparecieron cuando se publicaron. – Andy

1

La única razón bucle no se recomienda es que es lento. R está diseñado para trabajar en vectores a la vez y tiene muchas funciones para lograr esto. Toda la familia de aplicaciones, así como funciones como Vectorizar para ayudar. Entonces, la expresión idiomática es que si usa bucles no está pensando en R, pero a veces los bucles realmente son apropiados.

Para hacer esto en la forma de pensar R, Vectorice su función, si no está ya vectorizada (vea la función Vectorizar) luego llame esa función con toda la columna como argumento y asígnela a la nueva columna.

f<-Vectorize(function(x,...),'x') 
data$newcolumn<-f(data[,1]) 

La aplicar la familia (aplicar, sapply, lapply, mapply, tapply) son también alternativas. La mayoría de las funciones R nativas ya están vectorizadas, pero tenga cuidado al pasar argumentos adicionales que se supone deben interpretarse como vectores.