给出以下示例:
library(data.table)
mat <- data.table(x = c(1:10), y = c(11:20), z = c(21:30))
cut.head <- c(0, 2, 1)
cut.tail <- c(3, 1, 2)
cut.head
表示每列从顶部开始为NA的行数。
cut.tail
表示每列从最后一列起为NA的行数。
例如,如果使用cut.head
,则第y列的第1行和第2行将是NA,以及z的第1列
我希望返回如下:
x y z
1: 1 NA NA
2: 2 NA 22
3: 3 13 23
4: 4 14 24
5: 5 15 25
6: 6 16 26
7: 7 17 27
8: NA 18 28
9: NA 19 NA
10: NA NA NA
谢谢
答案 0 :(得分:3)
我只使用for
循环:=
(或set()
),以便快速且(相当)轻松阅读。
> for (i in 1:3) mat[seq_len(cut.head[i]), (i):=NA]
> mat
x y z
1: 1 NA NA
2: 2 NA 22
3: 3 13 23
4: 4 14 24
5: 5 15 25
6: 6 16 26
7: 7 17 27
8: 8 18 28
9: 9 19 29
10: 10 20 30
请注意:=
的LHS接受列号和名称。顺便说一句,这是有效的:
DT[, 2:=2] # assign 2 to column 2
用括号:=
包裹(i):=NA
的LHS,告诉它使用变量的值而不是其名称。
对于尾巴我首先尝试了以下内容,但.N
中i
无法使用for (i in 1:3) mat[.N+1-seq_len(cut.tail[i]), (i):=NA]
# .N now works in i
> mat
x y z
1: 1 NA NA
2: 2 NA 22
3: 3 13 23
4: 4 14 24
5: 5 15 25
6: 6 16 26
7: 7 17 27
8: NA 18 28
9: NA 19 NA
10: NA NA NA
>
。我已将FR#724添加为功能请求。更新:现已添加到2014年7月11日的v1.9.3
mat
我们不再需要重复使用符号> for (i in 1:3) mat[nrow(mat)+1-seq_len(cut.tail[i]), (i):=NA]
:
{{1}}