R:按组在 data.table 列中找到第一个非 NA 观察

标签 r data.table

我有一个 data.table有许多缺失值,我想要一个变量,它为每组中的第一个非缺失值提供 1。

假设我有这样一个 data.table:

library(data.table)
DT <- data.table(iris)[,.(Petal.Width,Species)]
DT[c(1:10,15,45:50,51:70,101:134),Petal.Width:=NA]

现在在开头,结尾和中间都有缺失。我试过两个版本,一个是:
DT[min(which(!is.na(Petal.Width))),first_available:=1,by=Species]

但它只找到全局最小值(在这种情况下,setosa 得到正确的 1),而不是分组的最小值。我认为这是因为 data.table第一个子集按 i,然后按组排序,对吗?所以它只适用于全局最小值 which(!is.na(Petal.Width)) 的行。这是第一个非 NA 值。

对 j 中的测试进行第二次尝试:
DT[,first_available:= ifelse(min(which(!is.na(Petal.Width))),1,0),by=Species]

它只返回一列 1。在这里,我没有很好的解释为什么它不起作用。

我的目标是:
DT[,first_available:=0]
DT[c(11,71,135),first_available:=1]

但实际上我有数百个组。任何帮助,将不胜感激!

编辑:this问题确实接近,但不是针对 NA 的,如果我理解正确,也不能解决这里的问题。我试过:
DT <- data.table(DT, key = c('Species'))
DT[unique(DT[,key(DT), with = FALSE]), mult = 'first']

最佳答案

这是一种方法:

DT[!is.na(Petal.Width), first := as.integer(seq_len(.N) == 1L), by = Species]

关于R:按组在 data.table 列中找到第一个非 NA 观察,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37723943/

相关文章:

r - 将函数转换为字符串

r - 如何在 R 中同时 grep 两个术语

r - 将每个组与 data.table 中的每个其他组进行比较

r - 有效地创建 a x b 扩展网格内存

r - 在 R 中使用 nloptr 不会更改初始值

r - 基于函数在数据框列表中创建一列

c++ - 如何构造这个分块三对角(稀疏)矩阵?

r - 按多列分组的汇总统计信息在与其对应的特定列上

r - 使用 data.table 通过多个键进行子集化的奇怪行为

r - 使用 data.table 按组选择行直到最后一个非缺失值