【问题标题】:Is it possible to loop within a "within(...)" structure?是否可以在“within(...)”结构中循环?
【发布时间】:2012-09-26 20:28:22
【问题描述】:

感谢我从阅读资料中获得的所有帮助。

当我只处理一个 data.frame 时,我对我的 R 循环不满意,因为我必须一遍又一遍地写下 dataframe 的名称,这会使我的 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() 语句和计算失败顺便说一句?

提前非常感谢! skr

【问题讨论】:

  • i 正在被分配(隐含地,由for 循环),因此within 将其值添加到数据框...

标签: r for-loop


【解决方案1】:

Ben 回答了您的主要问题,指出 i 是由 for 循环分配的。你可以通过尝试这样的方式来看到它是这样的:

for(j in 1:3) cat("hi\n") 
hi
hi
hi
> j
[1] 3

一种选择是通过将其值设为NULL 来删除不需要的i 变量:

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

【讨论】:

  • 酷,谢谢大家。我认为i 对此负责。你喜欢在within() 语句中构建复杂的嵌套for 循环吗?我的意思是,你必须明确摆脱i,这不是很优雅,对吧..
  • @skr -- 我不认为i &lt;- NULL 是优雅的,并且会避免它。如果您喜欢使用within(),您可以将for 循环封装在一个函数中(即myFun &lt;- function(dat) { for (i in ...) {.....} return(x))),然后在with 语句中使用该函数。这优雅,恕我直言。干杯。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-09-21
  • 2010-09-28
  • 1970-01-01
  • 1970-01-01
  • 2017-12-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多