2012-05-21 220 views
6

新手R用戶在這裏。所以我有一個數據集格式化,如:索引矩陣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 

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

我想子集數據的特定月份和申請變更率到temp然後保存結果。所以我有這樣的事情

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

,但我不斷收到這樣的錯誤

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

任何幫助,將不勝感激。

回答

2

首先,給變係數的值:

change <- 1 

現在,這裏是如何創建一個索引:

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

如果從一月所需的數據只是子集,

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

要保留整個數據幀,但只將變化因子添加到Jan temps中:

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

謝謝!正是我想要的。 – user1408959

1

首先,請注意subset不會產生一個指數,它產生含有Month == 1所有行原來的數據框的子集。

然後當您在做idx[,2]時,您正在選擇Temp列。

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

但你在使用這些作爲指數results,即您使用它們作爲行號。行號不能是像10.56-1.11,因此你的錯誤。另外,您正在選擇results的第一列,即Date並嘗試向其添加溫度。

有幾種方法可以做到這一點。

您可以創建TRUEMonth == 1FALSE一排的一個邏輯索引,否則像這樣:

idx <- datac1$Month == 1 

然後你可以使用該索引來選擇要修改datac1行(這是你試圖做最初,我認爲):

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

注意datac1$Temp[idx]選擇的datac1和的Temp列行。

你也可以做

datac1[idx,'Temp'] 

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

如果results是子集,其中Month == 1,嘗試:

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

這是因爲results只包含你感興趣的行,所以不需要做子集。

+0

我欣賞詳細的解釋。它幫助我瞭解到底發生了什麼。謝謝 – user1408959

1

就個人而言,我會使用ifelse()並利用句法美是within()爲一個不錯的班輪datacl <- within(datacl, Temp <- ifelse(Month == 1, Temp + change,Temp))。那麼,我說了一個班輪,但你需要在其他地方定義change

+0

也只是想提一下,你可以嵌套'ifelse()'語句來解釋其他月份或條件。 – Chase

+0

感謝您的提示! – user1408959