1

ご覧のとおり、下に価格と日の列があります

 Price  Day
    2   1
    5   2
    8   3
    11  4
    14  5
    17  6
    20  7
    23  8
    26  9
    29  10
    32  11
    35  12
    38  13
    41  14
    44  15
    47  16
    50  17
    53  18
    56  19
    59  20

次に、以下の出力が必要です

  Difference    Day
    12  5
    15  10
    15  15
    15  20

だから今、私は5日ごとに価格の違いを持っ​​ています...それは基本的に最初の日から5日目を差し引くだけです...そして5日目から10日目など....私はすでにそのコードを作成しましたデータを 5 日間隔に分けます...しかし、1 日目から 5 日目を引くコードが必要です....10 日目と 5 日目...など したがって、コードは次のようになります。

difference<-tapply(Price[,1],Day, ____________)

したがって、基本的に Price[,1] は私の Price データになります.....一方、「Day」は作成した変数で、Day データを 5 日間隔に分けることができます.....関数または別の変数に入れることができる空白のセクションは、1 日目の価格で 5 日目を差し引いてから、10 日目と 5 日目の価格を差し引くことができます...など....あなたは私を助ける必要はありません.私の日を間隔に分けてください...「違い」セクションのやり方だけです....みんなありがとう

4

3 に答える 3

5

data.frameあなたが「SODF」と呼ばれると仮定すると、ここに1つのオプションがあります:

within(SODF[c(1, seq(5, nrow(SODF), 5)), ], { 
  Price <- diff(c(0, Price)) 
})[-1, ]
#    Price Day
# 5     12   5
# 10    15  10
# 15    15  15
# 20    15  20

最初のステップは、基本的なサブセット化です。あなたの説明と予想される答えによると、最初の行が必要で、次に行 5 から 5 行ごとに必要です。

> SODF[c(1, seq(5, nrow(SODF), 5)), ]
   Price Day
1      2   1
5     14   5
10    29  10
15    44  15
20    59  20

そこからdiff、「価格」列で使用できますdiffが、入力よりも長さが 1 つ短いベクトルになるため、入力ベクトルを「パディング」する必要がありますdiff(c(0, Price))

# Correct values, but the number of rows needs to be 5
> diff(SODF[c(1, seq(5, nrow(SODF), 5)), "Price"])
[1] 12 15 15 15

次に、[-1, ]最後に余分な行を削除します。

アップデート

以下のコメントでは、@geektrader がコメント内で指摘しています (ありがとう!)。

SODF[c(1, seq(5, nrow(SODF), 5)), ]

入力として、data.frame代わりに以下を使用することを検討してください。

rbind(SODF[1,], SODF[$Day %% 5 == 0,] )

2 つのアプローチの違いは、最初のアプローチは単に行番号でサブセット化するのに対し、2 番目のアプローチは "Day" 列のに従ってサブセット化し、"Day" が 5 の倍数である行を抽出することです。この 2 番目のアプローチは次のようになります。たとえば、データセットに欠落している行がある場合に役立ちます。

于 2013-03-08T03:53:22.017 に答える
1

アナンダのアプローチは素晴らしいです (常に自分自身のことを忘れてください)。別のアプローチを次に示します。

dat2 <- dat[seq(0, nrow(dat), by=5), ]
data.frame(Difference=diff(c(dat[1,1], dat2[, 1])), Day=dat2[, 2])
于 2013-03-08T03:59:47.837 に答える
0

ここに、入力として行列がある場合の解決策があります

m行列、列col_id、および数値間隔が与えられた後続の関数は、intervすべての行で、行列の列intervの現在の値を前の値(5行前、同じ列、明らかに)から減算します。col_idm

結果はと呼ばれる新しい列に保存され、マトリックスdiffの最後に追加されます。m

つまり、このアプローチは@AnandaMahtoで使用されているものと非常によく似ています。

だから、これは関数です:

subtract_column <- function(m, col_id, interv) {
  select <- c(1, seq(interv, nrow(m), interv))
  cbind(m[select[-1], ], diff = diff(m[select, col_id]))
}

例:

# this emulates your data as a matrix
price_vect <- c(2,5,8,11,14,17,20,23,26,29,32,35,38,41,44,47,50,53,56,59)
day_vect <- 1:20
matr <- do.call(cbind, list(price = price_vect, day = day_vect))
# and this calls the function above and does the job:
# subtracts every 5 rows the current and the previous (5 rows back) value in the column `price` of matrix `matr`
subtract_column(matr, 'price', 5)

出力:

     price day diff
[1,]    14   5   12
[2,]    29  10   15
[3,]    44  15   15
[4,]    59  20   15
于 2013-03-08T04:15:56.223 に答える