2017-09-24 17 views
3

データフレーム内のRのn番目の状態の行番号を抽出する簡単な方法はありますか?たとえば、私は30列のデータフレームを持ち、すべて同じタイプの値を持っているとしましょう。私はいくつかの条件の2番目の発生が発生する各列から行番号を抽出したい。条件に一致するすべての行の数を抽出するのは簡単ですが、条件のn番目の一致に一致する行を抽出する方法を見つけることはできません。N番目のOccurenceの行番号を抽出する

私は、データフレームをリストに変換し、これらのデータフレームのそれぞれに累積合計列を追加し、累積合計が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番目の発生を抽出する方法を見つけ出すことができれば。私はほとんどすべてを試してきたし、すべてを検索し、まだかなりの困難を抱えています。どんな助けもありがとう。

+1

を使用することができますどのようにシンプルで見たときに私が適用されます()関数内で試した機能の量は恥ずかしいですあなたが今投稿したものはです。完璧に働いた。どうもありがとうございます! – coderX

+1

私が全部欠けていた部分は、最後に[2]でした。それ以外には、私は他のすべてを持っていた。最も簡単な部分を忘れてしまった。 – coderX

答えて

2

0より小さい値をチェックするいくつかの列があります(私は出力を短く保つために5つの列を使用しましたが、ソリューションは任意の数の列に対して機能します)。

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

我々は、単一の列

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

に0以上の値の行番号を見つけるためにwhichを使用することができるしかし、我々は、値がゼロ未満であった第二のインスタンスにのみ関心があります

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 
関連する問題