如何根据下一次出现在R中对数据帧进行子集?

时间:2013-07-12 14:57:08

标签: r dataframe subset

请允许我详细说明。基本上,我有一个包含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,然后我想将df从第4行子集化到第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行中分组。

我该怎么做?

2 个答案:

答案 0 :(得分:1)

一种方法是将连续NA的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
}

答案 1 :(得分:0)

如果您想拥有一个数据框,其中包含列中所有具有NA的行&#39; C4&#39;你这样做:

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

其中df是您的数据框。

希望它有所帮助。