我试图通过使用列中的一些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的行附加计数器但它似乎没有聚集在一起。有什么想法吗?
答案 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])