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

初始化为 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 回答
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 回答