r - 如何在特定列中用 NA 替换前 n1 行和最后 n2 行

标签 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 列的第一行和第二行将是 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 括起来,告诉它使用变量的值而不是变量的名称。

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

关于r - 如何在特定列中用 NA 替换前 n1 行和最后 n2 行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24647784/

相关文章:

r - 如何按组估算 data.table 中的值?

r - 如何使用自行车站数据对两个数据点之间的时间差进行子集化和查找

r - 在数据框中更有效地使用临时列(即时创建)

r - 从向量中为 data.table 的每一行选取一个随机元素

r - 计算不包括当前值的平均值

r - 基于间隔和两个变量 - 年龄类别创建二元变量

r - 使用 R 中的 data.table 添加观察计数到聚合

R计算相似行数据帧的出现

r - 如何使用lappy删除R中列表中元素的插槽

r - 为什么 lmer 在结果中将我的因素分解为所有级别?