新手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
任何帮助都将不胜感激。
答案 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
并尝试向其添加温度。
有几种方法可以做到这一点。
您可以为TRUE
和Month == 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
。