【问题标题】:How do I subset a data frame in R based on the next occurrence?如何根据下一次出现对 R 中的数据框进行子集化?
【发布时间】:2013-07-11 04:07:52
【问题描述】:

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

我该怎么做?

【问题讨论】:

  • 您希望将这些行的每一组(具有连续的 NA 行)放在一个列表中吗? (假设您有更多行可能不止一次发生这种情况)。
  • 也只有 C4 总是有 NA 吗?
  • @Arun,我想子集到一个新的数据框,所以看看上面的例子,一旦我在第 4 行遇到 NA,我想找到最后一个 NA在 NA 的范围内,然后是相应的子集。所以基本上我希望我的子集是:subset = df[4:7,]。问题是要找出最后一行。
  • 是的,我明白了。但是如果您的数据在 C4 列中也有第 9 行和第 10 行以及 NA 怎么办。您希望结果与第一个子集合并还是希望它成为列表中的另一个 data.frame?
  • @Arun,希望我的编辑能澄清你的问题。我不想将所有子集存储在一个列表中,因为在获得一个子集后,我会对其进行处理,然后不再需要它,因此无需存储所有子集。跨度>

标签: r dataframe subset


【解决方案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
}

【讨论】:

    【解决方案2】:

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

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

    df 是你的数据框。

    希望对你有帮助。

    【讨论】:

    • 这将分离所有的 NA,但在我的数据框中,行按时间顺序排列,并且 NA 出现在不同的组中,它们不在一条连续的线上。这就是为什么我只想在我正在查看的 NA 组中找到最后一个 NA。我将编辑上面的表格,以便您更好地理解
    猜你喜欢
    • 2021-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-17
    • 2013-08-15
    相关资源
    最近更新 更多