通过使用NA(或一些其他值)作为子集的端点来子集数据表

时间:2017-06-05 17:09:34

标签: r data.table subset na

我试图通过使用列中的一些NA值作为子集的终点来对数据表进行子集化。这是一些虚假数据,以显示我的意思:

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的行附加计数器但它似乎没有聚集在一起。有什么想法吗?

1 个答案:

答案 0 :(得分:2)

我们可以使用rleid创建一个分组变量,然后将split创建为list data.table

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])