2012-05-21 27 views
6

Ein Anfänger R Benutzer hier. Also ich habe einen Datensatz formated wie:Indizierung einer Matrix 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 

In R Syntax:

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

ich mag die Daten für einen bestimmten Monat der Teilmenge und einen Änderungsfaktor in dem temporären gelten dann die Ergebnisse speichern . so habe ich so etwas wie

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

aber ich halte einen Fehler bekommen wie

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

Jede mögliche Hilfe würde geschätzt.

Antwort

2

Zuerst gibt dem Faktoränderung Wert:

change <- 1 

Nun, hier ist, wie ein Index zu erstellen:

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

Wenn Sie nur die Teilmenge der Daten von Januar wollen,

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

Um den gesamten Datenrahmen zu behalten, aber nur den Änderungsfaktor zu Jan temps hinzufügen:

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

Danke! genau was ich wollte. – user1408959

1

Beachten Sie zunächst, dass subset keinen Index erzeugen, ist es eine Teilmenge der ursprünglichen Datenrahmen erzeugt alle Zeilen mit Month == 1 enthält.

Wenn Sie dann idx[,2] tun, wählen Sie die Spalte Temp aus.

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

Aber dann können Sie diese als Index in results verwenden, das heißt man sich als Zeilennummern verwenden. Zeilennummern können nicht wie 10.56 oder -1.11 sein, daher Ihr Fehler. Außerdem wählen Sie die erste Spalte results, die Date ist, und versuchen, Temperaturen hinzuzufügen.

Es gibt ein paar Möglichkeiten, wie Sie dies tun können.

Sie können einen logischen Index erstellen, die TRUE für eine Zeile mit Month == 1 und FALSE sonst wie so ist:

idx <- datac1$Month == 1 

Dann können Sie diesen Index verwenden, um die Zeilen in datac1 Sie ändern möchten auszuwählen (dies ist was Sie ursprünglich vorhatten, glaube ich):

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

Beachten Sie, dass datac1$Temp[idx] die Temp Spalte von datac1 und 01.231.715 wähltReihen.

könnten Sie auch tun

datac1[idx,'Temp'] 

oder

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

Wenn Sie nurresults wollen, dass die Teilmenge wo Month == 1 sein, versuchen Sie:

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

Dies liegt daran, results enthält nur die Zeilen, an denen Sie interessiert sind. Daher müssen Sie keine Teilmengen erstellen.

+0

Ich schätze die detaillierte Erklärung. Es hat mir geholfen, genau zu verstehen, was vor sich ging. Danke – user1408959

1

Persönlich würde ich ifelse() verwenden und die syntaktische Schönheit, die within() ist, für einen netten Einstrich datacl <- within(datacl, Temp <- ifelse(Month == 1, Temp + change,Temp)) nutzen. Nun, ich habe einen Liner gesagt, aber Sie müssten change auch woanders definieren.

+0

möchte auch nur erwähnen, dass du 'ifelse()' Aussagen verschachteln kannst, um andere Monate oder Bedingungen zu berücksichtigen. – Chase

+0

danke für den Tipp! – user1408959