0

请允许我详细说明。基本上,我有一个包含 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 行子集。

我该怎么做呢?

4

2 回答 2

1

一种方法是将连续NAs 的 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
}
于 2013-07-12T15:38:17.043 回答
0

如果您想拥有一个数据框,其中包含在“C4”列中具有 NA 的所有行,您可以:

df[which(is.na(df$C4)), ] 

其中 df 是您的数据框。

希望能帮助到你。

于 2013-07-12T15:10:57.567 回答