0

csvファイルをデータセットにインポートしました。ここで、i番目の行から始まる48行のデータブロックを新しいデータフレームにコピーし、3つの48行ブロックをスキップして、4番目の48行ブロックを新しいデータフレームの最後に追加します。データフレームの終わり。私はこの問題に何時間も費やしましたが、成功しませんでした。考えられるヒントを事前に感謝します。

4

2 に答える 2

2

非常にシンプルなワンライナー:

new.df <- old.df[ c( rep( F, i - 1 ), rep( T, 48 ), rep( F, 48 * 3 ), rep( T, 48 ) ), ]

でもねえ、もっと簡単にしましょう:

new.df <- old.df[ c( rep( F, i - 1 ), rep( c( T, F, F, F, T ), each=48 ) ), ]

あるいは

new.df <- old.df[ i - 1 + which( rep( c( T, F, F, F, T ), each=48 ) ), ]

説明:

true / false 値のベクトルを作成します。T に対応する行が選択されます。c() を使用してブロックを連結します。最初に i - 1 (F) をスキップし、次に 48 (T) を取得し、次に 3 * 48 をスキップして、再び 48 を 1 つ取得します。

于 2012-10-13T17:00:39.607 に答える
0
df <- data.frame(x = 1:1000, y = rnorm(1000))
> dim(df)
[1] 1000    2
# see that it has 1000 rows.
# let's say I want to copy 48 rows from row 102
new_df <- df[102:(102+48), ]
# or I do it with a variable
i <- 102
j <- i + 48
new_df <- df[i:j, ]
# If you need an uneven range, just make a vector
# Either specify a range of rows or just row numbers
rows_i_want <- c(1:48, 52, 55, 100:120, 128)
new_new_df <- df[rows_i_want, ]

以下は、これを行う一般的な関数の例です。data.frame

# This function takes a data.frame and a starting index and a block size
keep_rows <- function(df, i, block = 48) {
    # Grab the number of rows remaining in the df from i to end
    nr <- nrow(df[i:nrow(df), ])
    if(i>nr)
        stop("index is too high")

    start <- seq(i, nr, by = block)

    if(length(start)==1)
        stop("index is too high")

    end <- c(start[2:length(start)], nrow(df))
    df2 <- data.frame(start, end)
    ranges <- apply(df2, 1, function(x) { x[[1]]:x[[2]]})
    to_keep <- rep(c(T,F,F,F,T), floor(round(nr/block)))
    return(df[to_keep[1:length(ranges)],])
}
于 2012-10-13T16:58:50.717 に答える