2012-01-24 12 views
8

Estoy trabajando con un marco de datos que tiene 65 variables en él. La primera variable cataloga a una persona, y las siguientes 64 variables indican la distancia geográfica que esa persona es de cada una de las 64 ubicaciones. Usando R, me gustaría crear una nueva variable que catalogue la distancia más corta para cada persona a una de esas 64 ubicaciones.Obtener el mínimo de las filas en un marco de datos

Por ejemplo: si la persona X tiene 35, 50, 79, 100, 450 ... millas de distancia de las ubicaciones, me gustaría que la nueva variable les asigne automáticamente un 35, porque esta es la distancia más corta. Cualquier ayuda con esto sería muy apreciada. Gracias.

+0

df $ newvariable = apply (df [, 2: 65], 1, min) – aatrujillob

Respuesta

8
df <- data.frame(let=letters[1:25], d1=sample(1:25,25), d2=sample(1:25,25), d3=sample(1:25,25)) 

df$shortest <- apply(df[,2:4],1,min) 

La segunda línea aplica la función min a cada fila y la asigna a la nueva columna en mi data.frame df. Consulte ?apply para obtener más información sobre lo que está haciendo la segunda línea. Tenga cuidado de omitir la primera columna, o cualquier columna que no esté a distancias:

apply(df,1,min) da respuestas totalmente diferentes ya que encuentra el "mínimo" de cadenas.

> min(2:10) 
[1] 2 
> min(as.character(2:10)) 
[1] "10" 
4

Me acercaría a esto con la aplicación pero la transformación u otro enfoque podría funcionar.

#fake data set 
ID=LETTERS[1:5], distance=matrixsample(
DF <- as.data.frame(matrix(sample(1:100, rep=T, 100), 5, 20)) 
DF <- data.frame(ID=LETTERS[1:5], DF) 

#solution 
DF$newvar <- apply(DF[,-1], 1, min) 
12

O, usando el ejemplo de Justin:

df$shortest <- do.call(pmin,df[-1]) 

ver también ?pmin y ?do.call, y tenga en cuenta que se puede soltar la primera variable en su trama de datos mediante el uso de los índices de la lista (por lo que no se usa cualquier coma, consulte también ?Extract)

Cuestiones relacionadas