簡體   English   中英

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

[英]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 ,告訴它使用變量的值而不是其名稱。

對於尾巴,我首先嘗試了以下但是.Ni不可用。 我已經添加了作為功能請求, 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM