0

小さな問題があります。8208 行のデータを含むデータセットがあります。これは 1 列のデータです。n 行ごとにブロックとして取得し、これを新しいデータ フレームに追加します。

たとえば、次のようになります。

newdf には、列 1 から列 23 があります。

列 1 は、元のデータセットの行 289:528 で構成されます 列 2 は、元のデータセットの行 625:864 で構成されます

等々。「ブロック」サイズは 239 行で、ブロック間のジャンプは 336 行ごとです。

これを手動で行うことはできますが、面倒です。別の 11 セットのデータに対してこの手順全体を繰り返す必要があるため、より自動化されたアプローチが望ましいことは明らかです。

4

4 に答える 4

2

アップデート

OPにはブロックサイズが239要素であると記載されていますが、ブロックサイズが240であることが示されている行の例から明らかです

> length(289:528)
[1] 240

以下の例ではブロック長を 239 のままにしておきますが、実際に 240 である場合は調整してください。


質問からは明らかではありませんが、このようなものがあると仮定します

df <- data.frame(A = runif(8208))

8208 行のデータ フレーム。

A最初に、保持する必要があるの要素のインデックスを計算します。これは経由で行われます

want <- sapply(seq(289, nrow(df)-239, by = 336),
               function(x) x + (seq_len(239) - 1))

A次に、R が列ごとに行列を埋め、必要な要素を 239 行の行列に変換するという事実を使用できます。

mat <- matrix(df$A[want], nrow = 239)

これは機能します

> all.equal(mat[,1], df$A[289:527])
[1] TRUE

ただし、ここでは 239 のブロック長を使用していることに注意してください ( 289:527) 240 のブロック サイズであるため、OP が引用するインデックスではありません (上記の更新を参照)。

これをデータフレームにしたい場合は、追加するだけです

df2 <- as.data.frame(mat)
于 2013-07-02T15:36:57.620 に答える
1

これを試して:

1) インデックスのリストを作成する

lapply(seq(1, 8208, 336), function(X) X:(X+239)) -> Indices

2) データの選択

Columns <- lapply(Indices, function(X) OldDF[X,])

3) 選択したデータを列に結合する

NewDF <- do.call(cbind, Columns)
于 2013-07-02T15:36:30.837 に答える