2017-09-24 78 views
3

是否有一种简单的方法(或任何方式)提取数据帧中R中某些条件的第n次出现的行号?比方说,我有一个30列的数据框,所有相同类型的值。我想从每个发生第二次出现的情况的列中提取行号。提取与条件匹配的所有行的计数非常简单,但我无法弄清楚如何提取匹配第n个条件的行。我正在调整将数据框转换为列表,在每个数据框中添加一个累积总和列,并在累计总和命中4(例如)时获取行索引。但是,有一个比这更简单的方法。提取第N次出现的行号

例子:

#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次出现我以为我可以只使用适用于()。我已经尝试过几乎所有的东西,并且搜遍了所有东西,而且还很难过。任何帮助,将不胜感激。

+1

的功能,我内尝试的量apply()函数是尴尬你刚刚提交的是什么。完美工作。非常感谢! – coderX

+1

我一直想念的部分是[2]结尾。除此之外,我拥有其他一切。忘记最简单的部分。 – coderX

回答

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对所有列执行此操作(如原来的pr通过@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 

ovided或者,如果你喜欢一个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