【问题标题】:How to replace first n1 and last n2 rows with NA in specific columns如何在特定列中用 NA 替换前 n1 行和最后 n2 行
【发布时间】:2014-07-09 07:33:25
【问题描述】:

举个例子:

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

谢谢

【问题讨论】:

    标签: r data.table


    【解决方案1】:

    我只使用带有:=(或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 括起来,告诉它使用变量的值而不是变量名。

    对于尾部,我首先尝试了以下方法,但 .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]
    

    【讨论】:

      猜你喜欢
      • 2014-05-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-15
      • 2020-12-16
      • 1970-01-01
      • 2017-08-11
      • 2013-01-25
      相关资源
      最近更新 更多