1

次のようなデータフレームがあります。

df$a <- 1:20
df$b <- 2:21
df$c <- 3:22
df <- as.data.frame(df)

> df
    a  b  c
1   1  2  3
2   2  3  4
3   3  4  5
4   4  5  6
5   5  6  7
6   6  7  8
7   7  8  9
8   8  9 10
9   9 10 11
10 10 11 12
11 11 12 13
12 12 13 14
13 13 14 15
14 14 15 16
15 15 16 17
16 16 17 18
17 17 18 19
18 18 19 20
19 19 20 21
20 20 21 22

データ フレーム ( df$d) に別の列を追加して、5 行ごと ( df$d[seq(1, nrow(df), 4)]) が最初の列のそれぞれの行の開始の値を取るようにしたいと思います: df$a

私は手動の方法を試しましたが、これを簡単に実行できる for ループまたは短い方法があるかどうか疑問に思っていました。私は R を初めて使用するので、これが些細なことのように思える人がいたら申し訳ありません。

「手動」の方法:

df$d[1:5] <- df$a[1]
df$d[6:10] <- df$a[6]
df$d[11:15] <- df$a[11]
df$d[16:20] <- df$a[16]

>df
    a  b  c  d
1   1  2  3  1
2   2  3  4  1
3   3  4  5  1
4   4  5  6  1
5   5  6  7  1
6   6  7  8  6
7   7  8  9  6
8   8  9 10  6
9   9 10 11  6
10 10 11 12  6
11 11 12 13 11
12 12 13 14 11
13 13 14 15 11
14 14 15 16 11
15 15 16 17 11
16 16 17 18 16
17 17 18 19 16
18 18 19 20 16
19 19 20 21 16
20 20 21 22 16

私が試してみました

for (i in 1:nrow(df))
{df$d[i:(i+4)] <- df$a[seq(1, nrow(df), 4)]}  

しかし、これは私が望むようには進んでいません。私は何を間違っていますか?

4

3 に答える 3

2

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

df$d <- rep(df$a[seq(1,nrow(df),5)],each=5)
于 2013-05-20T16:37:59.557 に答える
1

そして、ここにdata.table解決策があります:

library(data.table)
dt = data.table(df)

dt[, d := a[1], by = (seq_len(nrow(dt))-1) %/% 5]
于 2013-05-20T16:49:43.243 に答える
1

NAに初期化した後、論理インデックスを使用します

 df$d <- NA
 df$d <- rep(df$a[ c(TRUE, rep(FALSE,4)) ], each=5)
 df
#--------
    a  b  c  d
1   1  2  3  1
2   2  3  4  1
3   3  4  5  1
4   4  5  6  1
5   5  6  7  1
6   6  7  8  6
7   7  8  9  6
8   8  9 10  6
9   9 10 11  6
10 10 11 12  6
11 11 12 13 11
12 12 13 14 11
13 13 14 15 11
14 14 15 16 11
15 15 16 17 11
16 16 17 18 16
17 17 18 19 16
18 18 19 20 16
19 19 20 21 16
20 20 21 22 16
于 2013-05-20T16:40:59.083 に答える