索引R中的矩阵

时间:2012-05-21 23:14:13

标签: r matrix indexing

新手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

任何帮助都将不胜感激。

3 个答案:

答案 0 :(得分: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)

如果您只想要1月份的数据子集,

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

保留整个数据框,但只将更改因子添加到Jan temps:

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

答案 1 :(得分:1)

首先,请注意subset不生成索引,它会生成原始数据框的子集,其中包含Month == 1的所有行。

然后当您执行idx[,2]时,您正在选择Temp列。

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

但是你将这些作为索引用于results,即你将它们用作行号。行号不能是10.56-1.11,因此您的错误。此外,您选择results的第一列Date并尝试向其添加温度。

有几种方法可以做到这一点。

您可以为TRUEMonth == 1的行创建FALSE的逻辑索引,否则就像这样:

idx <- datac1$Month == 1

然后你可以使用那个索引来选择你想要修改的datac1中的行(我认为这是你原本想要做的):

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

请注意,datac1$Temp[idx]会选择Temp行和datac1行的idx列。

您也可以

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只包含您感兴趣的行,所以不需要进行子集化。

答案 2 :(得分:1)

就我个人而言,我会使用ifelse()并利用within()的句法美来形成一个漂亮的一行datacl <- within(datacl, Temp <- ifelse(Month == 1, Temp + change,Temp))。好吧,我说过一个班轮,但你也需要在其他地方定义change