给出以下示例:
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 列的第一行和第二行将是 NA,z 的第一列也是 NA
我想要的返回如下:
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
谢谢
最佳答案
我只需使用带有 :=
(或 set()
)的 for
循环,这样它既快速又(相当)容易阅读。
> 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
中不可用。我已将其添加为功能请求,FR#724 .
更新:现已于 2014 年 7 月 11 日添加到 v1.9.3
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
>
我们不再需要忍受符号 mat
的重复:
> for (i in 1:3) mat[nrow(mat)+1-seq_len(cut.tail[i]), (i):=NA]
关于r - 如何在特定列中用 NA 替换前 n1 行和最后 n2 行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24647784/