2

Excel から OFFSET 関数をシミュレートしようとしています。これは単一の値に対して実行できることを理解していますが、範囲を返したいと思います。オフセット 1、グループ サイズ 2 の値のグループを返したいと思います。たとえば、行 4 では、列 a、行 3 & 2 の値を持つグループが必要です。申し訳ありませんが、困惑しています。

cbind などを使用して、この結果を別の列としてデータ フレームに追加することはできますか? または、これをベクトル化された関数で使用して、結果を合計または意味することはできますか?

モックアップの例:

> df <- data.frame(a=1:10)
> df
    a
1   1
2   2
3   3
4   4
5   5
6   6
7   7
8   8
9   9
10 10

> #PROCESS 

> df
    a   b
1   1   NA
2   2   (1)
3   3   (1,2)
4   4   (2,3)
5   5   (3,4)
6   6   (4,5)
7   7   (5,6)
8   8   (6,7)
9   9   (7,8)
10 10   (8,9)
4

2 に答える 2

3

これでうまくいくはずです:

df$b1 <- c(rep(NA, 1), head(df$a, -1))
df$b2 <- c(rep(NA, 2), head(df$a, -2))

データ フレームの列は単純なデータ型のみをサポートするため、結果は 2 つの列に存在する必要があることに注意してください。(複素数に頼る場合を除きます。)head負の引数を指定すると、末尾から引数の負の値が切り捨てられます。try head(1:10, -2). rep繰り返し、c連結です。<-まだそこにない場合、割り当ては新しい列を追加します。

Excel が OFFSET と呼ぶものは、ラグと呼ばれることもあります。

EDIT : Greg Snow のコメントに続いて、よりエレガントなバージョンですが、理解しにくいバージョンがあります。

df <- cbind(df, as.data.frame((embed(c(NA, NA, df$a), 3))[,c(3,2)]))

コンポーネントごとに試して、どのように機能するかを確認してください。

于 2013-03-01T01:52:41.190 に答える
0

このようなものが欲しいですか?

> df <- data.frame(a=1:10)
> b=t(sapply(1:10, function(i) c(df$a[(i+2)%%10+1], df$a[(i+4)%%10+1])))
> s = sapply(1:10, function(i) sum(b[i,]))
> df = data.frame(df, b, s)
> df
    a X1 X2  s
1   1  4  6 10
2   2  5  7 12
3   3  6  8 14
4   4  7  9 16
5   5  8 10 18
6   6  9  1 10
7   7 10  2 12
8   8  1  3  4
9   9  2  4  6
10 10  3  5  8
于 2013-02-28T22:02:09.853 に答える