繁体   English   中英

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

[英]How do I subset a data frame in R based on the next occurrence?

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

如果要使数据框包含“ C4”列中具有NA的所有行,请执行以下操作:

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

df是您的数据帧。

希望能帮助到你。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM