请允许我详细说明。基本上,我有一个包含4列的数据框,其中一列包含NA。当发生NA时,它们总是成组出现。我正在逐行浏览此数据帧,查看该列。我想做的是,一旦找到NA,就想在达到正常值之前,将数据帧从该行子集中到最后一次出现NA的行。
例如,假设我们看一下数据框df:
C1 C2 C3 C4 C5 C6
R1 2 1 2 1 0 0
R2 2 2 1 1 0 0
R3 0 0 1 1 2 1
R4 2 2 1 NA 0 0
R5 0 0 1 NA 2 1
R6 0 0 1 NA 2 1
R7 2 2 1 NA 0 0
R8 0 0 1 1 2 1
R9 2 1 2 1 0 0
R10 2 2 1 1 0 0
R11 0 0 1 1 2 1
R12 2 2 1 NA 0 0
R13 0 0 1 NA 2 1
R14 0 0 1 NA 2 1
然后,当我逐行遍历df时,我遇到了第4行中的第一个NA,然后我想将第4行中的df子集到第7行,这是最后一个NA在此特定NA组中的位置。
子集:
R4 2 2 1 NA 0 0
R5 0 0 1 NA 2 1
R6 0 0 1 NA 2 1
R7 2 2 1 NA 0 0
请注意,我并没有使用NA来对所有行进行子集化,只是我正在查看的NA的当前“组”。我不是第12-14行的子集。
我该怎么做呢?
一种方法是将连续NA
s的id存储在列表中,然后将其存储为子集,但稍后再使用(使用lapply
或显式for-loops
)
isna <- is.na(df$C4)
idx <- which(isna)
rr <- rle(isna)
idx <- split(idx, rep(seq(sum(rr$values)), rr$lengths[rr$values]))
# $`1`
# [1] 4 5 6 7
# $`2`
# [1] 12 13 14
它们对应于行号...现在,您可以子集化:
使用lapply
:
oo <- lapply(idx, function(ix) {
this_sub <- df[ix, ]
# do whatever you want
})
使用for-loop
:
for (i in seq_along(idx)) {
this_sub <- df[idx[[i]], ]
# do whatever you want
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句