通过使用 NA(或其他一些值)作为子集的端点来对数据 table 进行子集化

Subsetting data table by using NA's (or some other value) as endpoints for the subsets

我正在尝试通过使用列中的一些 NA 值作为子集的终点来对数据 table 进行子集化。这里有一些假数据来说明我的意思:

require(data.table)
set.seed(34)
somestuff <- c(NA,'sdr','utyrd','ytrd','fc',NA,NA,'09h','87h',NA,NA,NA,'0ij','5fdg','g7','h8o7hy')
someotherstuff <- sample(LETTERS,length(somestuff))

dat <- data.table(somestuff,someotherstuff)

我想将 'dat' 分为以下 3 个子集(下面的 dat1、dat2、dat3)。基本上是删除带有 NA 的行,但也利用第一列中的一些 NA 值作为子集的非包含端点。换句话说,用于子集化的组由一列中的单个或多个 NA 单元分隔。

dat1 <- dat[2:5]
dat2 <- dat[8:9]
dat3 <- dat[13:16]

我将使用的实际数据将有几个子集,通常在一列中有多个连续的 NA 值,当我每周提取此数据时,这些 NA 将位于不同的位置。我想看看是否有人知道基于使用公共元素(如 NA)或列中的字符串来指定子集端点的子集化的有效方法。我不喜欢 data.table 解决方案,尽管我最常使用这些解决方案。我一直在尝试像这样的 split() :

split(dat,by=is.na(dat$somestuff))

以及在没有 NA 的行上附加一个计数器,但它似乎没有放在一起。有什么想法吗?

我们可以用 rleid 创建一个分组变量,然后 splitdata.tables

list
dt <- dat[,  grp := rleid(is.na(somestuff))][!is.na(somestuff), .SD]          
unname(split(dt, by = "grp", keep.by = FALSE))
#[[1]]
#   somestuff someotherstuff
#1:       sdr              Y
#2:     utyrd              V
#3:      ytrd              F
#4:        fc              W

#[[2]]
#   somestuff someotherstuff
#1:       09h              N
#2:       87h              H

#[[3]]
#   somestuff someotherstuff
#1:       0ij              K
#2:      5fdg              A
#3:        g7              C
#4:    h8o7hy              I

或者可以用 base R

来完成
i1 <- is.na(dat$somestuff)
split(dat[!i1], cumsum(i1)[!i1])