通过使用 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
创建一个分组变量,然后 split
到 data.table
s
的 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])
我正在尝试通过使用列中的一些 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
创建一个分组变量,然后 split
到 data.table
s
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])