感谢您从阅读内容中获得的所有帮助。
当我只处理一个data.frame时,我对R循环不满意,因为我必须一遍又一遍地写下数据帧的名称,这会使我的R代码膨胀。
这是一个愚蠢的例子:
x<- rep(NA,10)
y <- 1:10
dat <- data.frame(x,y)
for(i in 2:nrow(dat)){
dat$x[i] <- dat$y[i] + dat$y[i-1]
}
所以我想要摆脱的是dat$
-bit。外部循环可以用within()
完成,但我不确定你是否可以用R实际做到这一点。我试过了:
remove(x,y) # In order to avoid accidental usage of the initial vectors
within(dat,{
for(i in 2:nrow(dat)){
x[i] <- y[i] + y[i-1]
}})
输出如下:
x y i
1 NA 1 10
2 3 2 10
3 5 3 10
4 7 4 10
5 9 5 10
6 11 6 10
7 13 7 10
8 15 8 10
9 17 9 10
10 19 10 10
所以循环确实有效,只是有一个新的神奇专栏。
有没有人知道(1)这里发生了什么,以及(2)如何优雅地处理这种循环(围绕包含几个within()
语句的循环包裹if()
的更复杂的示例计算失败btw?
提前多多感谢! SKR
答案 0 :(得分:4)
Ben回答了您的主要问题,指出i
循环正在分配for
。你可以通过尝试这样的事情来看到这一点:
for(j in 1:3) cat("hi\n")
hi
hi
hi
> j
[1] 3
一种选择就是通过使其值i
删除不需要的NULL
变量:
within(dat,{
for(i in 2:nrow(dat)){
x[i] <- y[i] + y[i-1]
}
i <- NULL
})
另一种方法是使用with()
代替within()
:
dat$x <- with(dat, {
for(i in 2:nrow(dat)){
x[i] <- y[i] + y[i-1]
}
x
})
最后,虽然我发现你的是一个玩具示例,但最好的解决方案通常完全避免for
循环:
d <- data.frame(y=1:10)
within(d, {x = y + c(NA, head(y, -1))})
# y x
# 1 1 NA
# 2 2 3
# 3 3 5
# 4 4 7
# 5 5 9
# 6 6 11
# 7 7 13
# 8 8 15
# 9 9 17
# 10 10 19