2016-10-13 11 views
1

私は自分自身をgrep()の機能の限界で見つけました、あるいはこれを行う効率的な方法があります。大規模なデータセットを2つの属性でフィルタリングし、サブセットに分割する方法は? R/Grep

Date <- c("31-DEC-2014","31-DEC-2014","31-DEC-2014","30-DEC-2014", 
      "30-DEC-2014","30-DEC-2014", "29-DEC-2014","29-DEC-2014","29-DEC-2014") 

ISIN <- c("LU0168343191", "TW0002418001", "GB00B3FFY088","LU0168343191", 
      "TW0002418001", "GB00B3FFY088","LU0168343191", "TW0002418001", "GB00B3FFY088") 


price <-c(seq(1:9)) 

df <- as.data.frame(cbind(Date, ISIN, price)) 

および所望の結果は、以下の(Result_I 3つの個々の識別子のX3)

ように見えるメイン・データ・ファイルのサブセットを含む list()ある:

サンプルデータフレームの始まり

考えられるのは、最初にデータをISINでフィルタリングし、からまでフィルタする必要があるということです。この2ステップのプロセスでは、データをそのまま維持する必要があります。

Result_d <- c("31-DEC-2014", "30-DEC-2014","29-DEC-2014") 
Result_I <- c("LU0168343191","LU0168343191","LU0168343191") 
Result_P <- c(1,4,7) 

Result_df <- cbind(Result_d, Result_I, Result_P) 

半ばに保管してくださいは、上記のデモを目的としており、実際のデータ・セットが適用にかかわらずがあるので、私は何かのためにlookignていますようResult_dあたり450以上の異なる日の期間にわたって500万行と50列を持っていますnrowまたはNcoI部位の

何私がこれまで持っている:

Unique_Dates <- unique(df$Date) 

私はすべてのユニークな日付と店舗を取ります

識別子のために同じ:今

Unique_ID <- unique(df$ISIN) 

grepを問題:私はUnique_Datesを含むすべての行を望んでいた場合

私のようなものだろう:

pattern <- paste(Unique_dates, collapse = "|") 

result <- as.matrix(df[grep(pattern, df$Date),]) 

をして、これは基本的に取得します全データセット。誰かがこれを行う効率的な方法を知っているのだろうかと思います。

ありがとうございます。

+0

'DF%>% dplyr ::フィルタ(grepl(パターン= "LU"、ISIN)) 'と日付と範囲については' lubridate' – Drey

+0

を使用してそれ'df [!duplicated(df $ Date)、]'おそらく? – Jaap

+0

あなたのコードはエラーを出力します。それはまた "LU"に限定されています。ここで私は約8000の固有IDを持っています。同じ日付に同じIDの複数のエントリがあるので、ユニークな日付フィルタが適用されていることが重要です –

答えて

0

我々は「日付」、「i」はインデックスに基づいてgrepで返さ指定し、Data.tableをサブセットによってグループ化され、(setDT(df)「)data.table」に「data.frame」を変換する(.SD)がベース'i'インデックスに表示されます。

dplyrを使用
library(data.table) 
setDT(df)[grep("LU", ISIN), .SD, by = Date] 
#   Date   ISIN price 
#1: 31-DEC-2014 LU0168343191  1 
#2: 30-DEC-2014 LU0168343191  4 
#3: 29-DEC-2014 LU0168343191  7 
+0

私の主なデータに私はこのエラーが表示されます: '[.data.table'(setDT(PORTFO_Dat2)、grep(" LU0168343191 "、PORTFO_Dat2 $ ISIN.code)のエラー: 'キーのリストは長さ(5114748)で、長さはxの行やi(120)の行の長さと同じでなければなりません –

+0

@AlexBădoi 'PORTFO_Dat2 $'は使わなかったので、 'ISIN.code' – akrun

+1

これはどれくらいうまくいき、どのようにシンプルに適用するのが驚くべきことです。私のIDのすべてをループするだけです。ありがとうございました –

2

library(dplyr) 

Date <- c("31-Dec-2014","31-Dec-2014","31-Dec-2014","30-Dec-2014", 
      "30-Dec-2014","30-Dec-2014", "29-Dec-2014","29-Dec-2014","29-Dec-2014") 

ISIN <- c("LU0168343191", "TW0002418001", "GB00B3FFY088","LU0168343191", 
      "TW0002418001", "GB00B3FFY088","LU0168343191", "TW0002418001", "GB00B3FFY088") 


price <-c(seq(1:9)) 

DF <- data.frame(Date, ISIN, price,stringsAsFactors=FALSE) 
DF$Date=as.Date(DF$Date,"%d-%b-%Y") 



#Examine data ranges and frequencies 

#date range 
range(DF$Date) 

#date frequency count 
table(DF$Date) 

#ISIN frequency count 
table(DF$ISIN) 


#select ISINs for filtering, with user defined choice of filters 

# numISIN = 2 
# subISIN = head(names(sort(table(DF$ISIN))),numISIN) 


subISIN = names(sort(table(DF$ISIN)))[2] 


subDF=DF %>% 
dplyr::group_by(ISIN) %>% 
dplyr::arrange(ISIN,Date) %>% 
dplyr::filter(ISIN %in% subISIN) %>% 
as.data.frame() 

#> subDF 
#  Date   ISIN price 
#1 2014-12-29 LU0168343191  7 
#2 2014-12-30 LU0168343191  4 
#3 2014-12-31 LU0168343191  1 
+0

私の質問に答える時間をとってくれてありがとう –

関連する問題