2017-09-24 59 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