提取第N次出现的行号

时间:2017-09-24 22:56:41

标签: r

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

我正在调整将数据帧转换为列表的想法,在每个数据帧中添加累积和列,并在累积总和达到4时获取行索引(例如)。但是,必须比这更容易。

示例:

cfset session

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

1 个答案:

答案 0 :(得分:2)

我们要检查几个列,我们要检查小于零的值(我使用了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为所有列执行此操作(最初由@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