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

任何帮助,将不胜感激。

4

3 回答 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)

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

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

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

datacl$Temp[jan.idx] <- datacl$Temp[jan.idx] + change
于 2012-05-21T23:22:08.527 回答
1

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

然后当你在做的时候idx[,2],你正在选择Temp列。

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

但是随后您将这些用作 的索引results即您将它们用作行号。行号不能是10.56or之类的东西-1.11,因此您的错误。results此外,您正在选择其中的第一列Date并尝试为其添加温度。

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

您可以TRUE为一行创建一个逻辑索引Month == 1FALSE否则如下所示:

idx <- datac1$Month == 1

然后您可以使用该索引来选择datac1要修改的行(我认为这是您最初尝试做的):

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

请注意,datac1$Temp[idx]选择Tempdatac1idx行。

你也可以做

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

于 2012-05-21T23:22:47.973 回答
1

就个人而言,我会使用ifelse()和利用句法之美,这是within()一个不错的 one liner datacl <- within(datacl, Temp <- ifelse(Month == 1, Temp + change,Temp))。好吧,我说的是一个班轮,但你也需要在change其他地方定义。

于 2012-05-22T00:30:40.493 回答