2012-05-21 17 views
6

Un utente R principiante qui. Così ho un set di dati formattato come:indicizzazione di una matrice in 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 

Nella sintassi R:

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)) 

vorrei sottoinsieme dei dati per un determinato mese e applicare un fattore di cambiamento per la temperatura quindi salvare i risultati . così ho qualcosa di simile

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

ma io continuo a ricevere un errore come

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

Qualsiasi aiuto sarebbe apprezzato.

risposta

2

In primo luogo, dare il fattore di cambiamento di un valore:

change <- 1 

Ora, qui è come creare un indice:

# 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) 

Se si desidera solo il sottoinsieme di dati da gennaio,

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

Per mantenere l'intero frame di dati, ma aggiungere solo il fattore di modifica a Jan temp:

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

Grazie! esattamente quello che volevo – user1408959

1

In primo luogo, si noti che subset non produce un indice, che produce un sottoinsieme del vostro dataframe originale contenente tutte le righe con Month == 1.

Quindi, quando si esegue idx[,2], si sta selezionando la colonna Temp.

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

Ma poi si sta utilizzando questi come un indice di in results, vale a dire li stai usando come numeri di riga. I numeri di riga non possono essere cose come 10.56 o -1.11, quindi il tuo errore. Inoltre, stai selezionando la prima colonna di results che è Date e stai provando ad aggiungere temperature ad esso.

Ci sono alcuni modi per farlo.

È possibile creare un indice logico che è TRUE per una riga con Month == 1 e FALSE altrimenti in questo modo:

idx <- datac1$Month == 1 

Quindi è possibile utilizzare tale indice per selezionare le righe in datac1 che si desidera modificare (questo è quello che stavi cercando di fare in origine, credo):

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

Nota che datac1$Temp[idx] seleziona la colonna Temp del datac1 e 01.231.righe.

Si potrebbe anche fare

datac1[idx,'Temp'] 

o

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

Se solo vuole results essere il sottogruppo in cui Month == 1, provare:

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

Questo perché results contiene solo le righe a cui sei interessato, quindi non è necessario eseguire operazioni secondarie.

+0

Apprezzo la spiegazione dettagliata. Mi ha aiutato a capire esattamente cosa stava succedendo. Grazie – user1408959

1

Personalmente, vorrei usare ifelse() e sfruttare la bellezza sintattica che è within() per una bella fodera datacl <- within(datacl, Temp <- ifelse(Month == 1, Temp + change,Temp)). Bene, ho detto una nave, ma dovresti definire anche change da qualche altra parte.

+0

, inoltre, voglio solo ricordare che puoi annidare le istruzioni 'ifelse()' per tenere conto di altri mesi o condizioni. – Chase

+0

grazie per il suggerimento! – user1408959

Problemi correlati