在R中索引矩阵

6

我是一名初学者,对 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个回答

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) 

为了保留整个数据框,但只将变化因素添加到一月份的温度中:
datacl$Temp[jan.idx] <- datacl$Temp[jan.idx] + change

谢谢!正是我想要的。 - user1408959

1
首先,注意到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.

如果你只想让结果成为一个子集,其中Month == 1,请尝试:
results <- subset(datac1, Month == 1)
results$Temp <- results$Temp + change

这是因为results只包含你感兴趣的行,所以不需要进行子集操作。

我非常感谢您的详细解释,它帮助我准确理解了正在发生的事情。谢谢 - user1408959

1

个人而言,我会使用ifelse()函数,并利用语法美感,使用一个漂亮的一行代码:datacl <- within(datacl, Temp <- ifelse(Month == 1, Temp + change,Temp))。好吧,我说是一行代码,但你还需要在其他地方定义change


还想提一下,您可以嵌套 ifelse() 语句来处理其他月份或条件。 - Chase

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接