4

ただ読んでくれたすべての助けに感謝します。

1つの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$ビットです。ループの外側では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

4

1 に答える 1

4

ベンは、ループiによって割り当てられていることに注意して、あなたの主な質問に答えました。for次のようなことを試してみると、そうなっていることがわかります。

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

1つのオプションは、値を作成して不要なi変数を削除することNULLです。

within(dat,{
for(i in 2:nrow(dat)){
    x[i] <- y[i] + y[i-1]
}
i <- NULL
})

もう1つは、次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
于 2012-09-26T20:37:29.030 に答える