簡體   English   中英

索引R中的矩陣

[英]indexing a matrix in 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))

我想對特定月份的數據進行子集化,並將更改因子應用於臨時值,然后保存結果。 所以我有類似的東西

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

任何幫助,將不勝感激。

首先,給變化因子一個值:

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)

如果你只需要1月份的數據子集,

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

要保留整個數據框,但只將更改因子添加到Jan temps:

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

首先,請注意subset不會生成索引,它會生成原始數據框的子集,其中包含Month == 1所有行。

然后當你做idx[,2] ,你正在選擇Temp列。

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

但是,您使用這些作為results索引 ,即您將它們用作行號。 行號不能是10.56-1.11類的東西,因此你的錯誤。 此外,您正在選擇第一列results ,即Date並嘗試向其添加溫度。

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

您可以為Month == 1的行創建一個TRUE的邏輯索引,否則為FALSE

idx <- datac1$Month == 1

然后你可以使用該索引來選擇你想要修改的datac1的行(我想這是你原本想要做的):

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

請注意, datac1$Temp[idx]選擇datac1Temp列和idx行。

你也可以這樣做

datac1[idx,'Temp']

要么

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

如果您希望resultsMonth == 1的子集,請嘗試:

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

這是因為results只包含您感興趣的行,因此不需要進行子集化。

就個人而言,我會使用ifelse()並利用within()的句法美來獲得一個漂亮的襯里datacl <- within(datacl, Temp <- ifelse(Month == 1, Temp + change,Temp)) 好吧,我說過一個班輪,但你也需要在change地方定義change

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM