【问题标题】:Extracting the Row Number of the Nth Occurence提取第 N 次出现的行号
【发布时间】:2017-09-24 22:56:41
【问题描述】:

有没有一种简单的方法(或任何方法)来提取数据帧中 R 中某个条件第 n 次出现的行号?假设我有一个包含 30 列的数据框,所有类型的值都是相同的。我想从第二次出现某些情况的每一列中提取行号。提取与条件匹配的所有行的计数非常简单,但我不知道如何提取匹配条件第 n 次出现的行。

我正在考虑将数据帧转换为列表,在每个数据帧中添加一个累积总和列,并在累积总和达到 4 时获取行索引(例如)。但是,一定有比这更简单的方法。

例子:

#create data
example<-replicate(30,rnorm(n=10))

#pseudo code
which(row of 2nd negative number for each column)
print row number that satisfies condition for each column

如果我能弄清楚如何提取第 n 次出现,我假设我可以使用 apply()。我已经尝试了几乎所有东西并搜索了所有内容,但仍然很难。任何帮助将不胜感激。

【问题讨论】:

  • 我在 apply() 函数中尝试的函数数量令人尴尬,因为您刚刚提交的内容如此简单。工作完美。非常感谢!
  • 我一直错过的部分是最后的 [2]。除此之外,我拥有其他一切。忘记了最简单的部分。

标签: r


【解决方案1】:

我们有几列要检查小于零的值(我使用了 5 列来保持输出简短,但解决方案适用于任意数量的列)。

set.seed(123)
example <- replicate(5, rnorm(n = 10))

我们可以使用which来查找单列中小于0的值的行数

which(example[, 4] < 0)
#> [1]  2  8  9 10

但我们只对值小于零的第二个实例感兴趣

which(example[, 4] < 0)[2]
#> [1] 8

您可以使用 sapply 对所有列执行此操作(最初由 cmets 中的 @d.b 提供)

sapply(as.data.frame(example), function(x) which(x < 0)[2])
#> V1 V2 V3 V4 V5 
#>  2  8  2  8  2

sapply(1:NCOL(example), function(i) which(example[,i] < 0)[2])
#> [1] 2 8 2 8 2

或者,如果您更喜欢 tidyverse 方法,您可以使用 dplyr::summarise_all

library(dplyr)
as_tibble(example) %>% summarise_all(function(x) which(x < 0)[2])
#> # A tibble: 1 x 5
#>      V1    V2    V3    V4    V5
#>   <int> <int> <int> <int> <int>
#> 1     2     8     2     8     2

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-28
    • 1970-01-01
    • 2021-12-19
    • 2019-10-16
    • 1970-01-01
    • 2016-07-25
    相关资源
    最近更新 更多