如何在特定列中用NA替换第一个n1行和最后一行n2行

时间:2014-07-09 07:33:26

标签: r data.table

给出以下示例:

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

谢谢

1 个答案:

答案 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,告诉它使用变量的值而不是其名称。

对于尾巴我首先尝试了以下内容,但.Ni无法使用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}}