[英]How to replace first n1 and last n2 rows with NA in specific columns
給出以下示例:
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
表示每列從頂部開始的行數。
cut.tail
表示每列從最后一列開始的行數。
例如,如果使用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
謝謝
我只是使用帶有:=
(或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
將LHS包含在:=
括號中, (i):=NA
,告訴它使用變量的值而不是其名稱。
對於尾巴,我首先嘗試了以下但是.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]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.