2012-05-21 12 views
6

Un usuario R novato aquí. Así que tengo un conjunto de datos formateado como:indexando una matriz en R

Date Temp Month 
1-Jan-90 10.56  1 
2-Jan-90 11.11  1 
3-Jan-90 10.56  1 
4-Jan-90 -1.67  1 
5-Jan-90 0.56  1 
6-Jan-90 10.56  1 
7-Jan-90 12.78  1 
8-Jan-90 -1.11  1 
9-Jan-90 4.44  1 
10-Jan-90 10.00  1 

En R sintaxis:

datacl <- structure(list(Date = structure(1:10, .Label = c("1990/01/01", 
    "1990/01/02", "1990/01/03", "1990/01/04", "1990/01/05", "1990/01/06", 
    "1990/01/07", "1990/01/08", "1990/01/09", "1990/01/10"), class = "factor"), 
     Temp = c(10.56, 11.11, 10.56, -1.67, 0.56, 10.56, 12.78, 
     -1.11, 4.44, 10), Month = c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
     1L, 1L)), .Names = c("Date", "Temp", "Month"), class = "data.frame", row.names = c(NA, 
    -10L)) 

me gustaría subconjunto de los datos de un mes en particular y aplicar un factor de cambio en la temperatura a continuación, guardar los resultados . así que tengo algo así como

idx <- subset(datacl, Month == 1) # Index 
results[idx[,2],1] = idx[,2]+change # change applied to only index values 

pero aparece un error como

Error in results[idx[, 2], 1] = idx[, 2] + change: 
    only 0's may be mixed with negative subscripts 

Cualquier ayuda sería apreciada.

Respuesta

2

En primer lugar, dar el factor de cambio de un valor:

change <- 1 

Ahora, aquí es cómo crear un índice:

# one approach to subsetting is to create a logical vector: 
jan.idx <- datacl$Month == 1 

# alternatively the which function returns numeric indices: 
jan.idx2 <- which(datacl$Month == 1) 

Si desea sólo el subconjunto de los datos de enero,

jandata <- datacl[jan.idx,] 
transformed.jandata <- transform(jandata, Temp = Temp + change) 

Para mantener todo el marco de datos, pero solo agregue el factor de cambio a las temperaturas de enero:

datacl$Temp[jan.idx] <- datacl$Temp[jan.idx] + change 
+0

Gracias! exactamente lo que quería. – user1408959

1

En primer lugar, tenga en cuenta que subset no produce un índice, que produce un subconjunto de la trama de datos original que contiene todas las filas con Month == 1.

Cuando está haciendo idx[,2], está seleccionando la columna Temp.

results[idx[,2],1] = idx[,2] + change 

Pero entonces está utilizando estos como un índice en results, es decir, que los está utilizando como números de fila. Los números de fila no pueden ser como 10.56 o -1.11, de ahí su error. Además, está seleccionando la primera columna de results que es Date e intenta agregarle temperaturas.

Hay varias formas de hacerlo.

Puede crear un índice lógico que es TRUE para una fila con Month == 1 y FALSE otra manera, así:

idx <- datac1$Month == 1 

A continuación, puede utilizar ese índice para seleccionar las filas de datac1 que desea modificar (esto es lo que estaba tratando de hacer originalmente, creo):

datac1$Temp[idx] <- datac1$Temp[idx] + change # or 'results' instead of 'datac1'? 

Tenga en cuenta que datac1$Temp[idx] selecciona la columna de Tempdatac1 y el idx filas.

También podría hacer

datac1[idx,'Temp'] 

o

datac1[idx,2] # as Temp is the second column. 

Si única desea results ser el subgrupo donde Month == 1, probar:

results <- subset(datac1, Month == 1) 
results$Temp <- results$Temp + change 

Esto se debe a results solo contiene las filas que le interesan, por lo que no es necesario hacer subconjuntos.

+0

Agradezco la explicación detallada. Me ayudó a entender exactamente lo que estaba pasando. Gracias – user1408959

1

Personalmente, usaría ifelse() y aprovecharía la belleza sintáctica que es within() para un buen trazador de líneas datacl <- within(datacl, Temp <- ifelse(Month == 1, Temp + change,Temp)). Bueno, dije un trazador de líneas, pero necesitarías definir change en otro lugar también.

+0

también solo quiero mencionar que puede anidar declaraciones 'ifelse()' para dar cuenta de otros meses o condiciones. – Chase

+0

gracias por la propina! – user1408959

Cuestiones relacionadas