R: data.table, 将组的第一个和最后一个值设置为 NA
R: data.table, set first and last value of a group to NA
我想将组中的第一个和最后一个值设置为 NA。这是一个例子:
DT <- data.table(v = rnorm(12), class=rep(1:3, each=4))
DT[, v[c(1,.N)] := NA , by=class]
但这不起作用。我该怎么做?
有了辅助函数就很简单了
set.na = function(x,y) {x[y] = NA; x}
DT[, set.na(v,c(1,.N)) , by=class]
修改数据子集的规范方法是使用i
来定义子集。 [
不能与 :=
一起使用。按照@David Arenburg 的建议创建一个临时 i
,或者您可以使用 c(NA, v[-c(1, .N)], NA)
构造自己创建结果向量。
DT[, v := c(NA, v[-c(1, .N)], NA)[1:.N], by = class]
但是,您还应注意,行顺序可能会发生变化,例如设置新键或使用任意数量的功能。所以你应该非常小心这个操作。
目前,解决这个问题的方法是先提取索引,然后通过引用进行赋值。
idx = DT[, .(idx = .I[c(1L, .N)]), by=class]$idx
DT[idx, v := NA]
我会尝试将此示例添加到 Reference semantics 插图中。
这可能不是单行代码,但代码中确实有 'first' 和 'last' :)
> DT <- data.table(v = rnorm(12), class=rep(1:3, each=4))
> setkey(DT, class)
> classes = DT[, .(unique(class))]
> DT[classes, v := NA, mult='first']
> DT[classes, v := NA, mult='last']
> DT
v class
1: NA 1
2: -1.8191 1
3: -0.6355 1
4: NA 1
5: NA 2
6: -1.1771 2
7: -0.8125 2
8: NA 2
9: NA 3
10: 0.2357 3
11: 0.3416 3
12: NA 3
>
非键列的顺序也被保留。我认为这是一个记录(致力于)的功能。
我想将组中的第一个和最后一个值设置为 NA。这是一个例子:
DT <- data.table(v = rnorm(12), class=rep(1:3, each=4))
DT[, v[c(1,.N)] := NA , by=class]
但这不起作用。我该怎么做?
有了辅助函数就很简单了
set.na = function(x,y) {x[y] = NA; x}
DT[, set.na(v,c(1,.N)) , by=class]
修改数据子集的规范方法是使用i
来定义子集。 [
不能与 :=
一起使用。按照@David Arenburg 的建议创建一个临时 i
,或者您可以使用 c(NA, v[-c(1, .N)], NA)
构造自己创建结果向量。
DT[, v := c(NA, v[-c(1, .N)], NA)[1:.N], by = class]
但是,您还应注意,行顺序可能会发生变化,例如设置新键或使用任意数量的功能。所以你应该非常小心这个操作。
目前,解决这个问题的方法是先提取索引,然后通过引用进行赋值。
idx = DT[, .(idx = .I[c(1L, .N)]), by=class]$idx
DT[idx, v := NA]
我会尝试将此示例添加到 Reference semantics 插图中。
这可能不是单行代码,但代码中确实有 'first' 和 'last' :)
> DT <- data.table(v = rnorm(12), class=rep(1:3, each=4))
> setkey(DT, class)
> classes = DT[, .(unique(class))]
> DT[classes, v := NA, mult='first']
> DT[classes, v := NA, mult='last']
> DT
v class
1: NA 1
2: -1.8191 1
3: -0.6355 1
4: NA 1
5: NA 2
6: -1.1771 2
7: -0.8125 2
8: NA 2
9: NA 3
10: 0.2357 3
11: 0.3416 3
12: NA 3
>
非键列的顺序也被保留。我认为这是一个记录(致力于)的功能。