2017-06-02 42 views
1

我有一個擁有250萬行的數據幀(df)。示例數據幀如下所示:如何在R中抽取某些行而無需一次又一次地運行整個數據

PERMNO <- c(10000,10000,10001,10001,10001,10001, 10002,10002,10002) 

TICKER <- c('OMFGA','OMFGA', 'GFGC', 'GFGC', 'GFGC', 'GFGC', 'MBNC', 'MBNC', 'MBNC') 

date <- as.Date(c('1986-03-31','1986-04-30','1986-01-31', '1986-01-31', '1986-03-31', '1986-04-30', '1986-04-30','1986-05-30', '1986-05-30')) 

df = data.frame(PERMNO, date, TICKER) 

在此示例中,有3個獨特的PERMNO。現在我需要提取給定的PERMNO的所有數據,並檢查是否有重複的日期。我的目的是爲特定的PERMNO刪除重複日期的行。這個操作我爲所有獨特的PERMNO做的

我的方法:我使用子集函數來提取特定PERMNO的數據,然後檢查日期中的重複項。但是使用這種方法,我的代碼每次都會運行整個數據(原始數據集中有250萬行),以便爲特定的PERMNO提取數據。有沒有更簡單的方法來做到這一點?由於我擁有22000個獨特的PERMNO,代碼將永久運行在For循環中。

這裏是我使用的代碼:

uniqueperm = unique(df$PERMNO) 

lenperm = length(uniqueperm) 

data_final = df[FALSE,] 

for(i in 1:lenperm){ 

     perm = uniqueperm[i] 
     df1 = filter(df, PERMNO == perm) 
     df1 = subset(df1,!duplicated(df1$date)) 
     data_final = rbind(data_final,df1) 
     df1 = df1[FALSE,] 
} 

data_final 
+1

這不就是'PERMNO'和'date'上的重複,那麼如果你想在每個'PERMNO'子集內的'date'上尋找重複的東西?即'重複(df [c(「PERMNO」,「date」)])'或者我錯過了一些微妙的東西? – thelatemail

+0

你可以添加你的代碼(For循環),所以我們有一些參考? –

+0

如果您發佈了您正在運行的代碼,我會得到您所描述的內容,但它會更容易準確地看到它。 – jamzsabb

回答

1

這應該是比for循環用於大型數據集快:

dates <- lapply(split(df, df$PERMNO), '[[', "date") 
df2 <-mapply(function(x,y)x[!y,], 
      split(df,df$PERMNO), 
      lapply(dates, duplicated), 
      SIMPLIFY = FALSE) 

do.call(rbind, df2) 

#   PERMNO  date TICKER 
# 10000.1 10000 1986-03-31 OMFGA 
# 10000.2 10000 1986-04-30 OMFGA 
# 10001.3 10001 1986-01-31 GFGC 
# 10001.5 10001 1986-03-31 GFGC 
# 10001.6 10001 1986-04-30 GFGC 
# 10002.7 10002 1986-04-30 MBNC 
# 10002.8 10002 1986-05-30 MBNC 
+0

我試過這段代碼。這需要很長時間。尋找會跑得更快的東西。 – DenaG

3

這應該是所有相當快但海量數據集:

df[!duplicated(df[c("PERMNO","date")]),] 
# PERMNO  date TICKER 
#1 10000 1986-03-31 OMFGA 
#2 10000 1986-04-30 OMFGA 
#3 10001 1986-01-31 GFGC 
#5 10001 1986-03-31 GFGC 
#6 10001 1986-04-30 GFGC 
#7 10002 1986-04-30 MBNC 
#8 10002 1986-05-30 MBNC 

類似的數據提供了基本時序你有什麼:

df2 <- data.frame(PERMNO=sample(1:22000,2.5e6,replace=TRUE), date=1:2.5e6) 
nrow(df2) 
#[1] 2500000 
length(unique(df2$PERMNO)) 
#[1] 22000 
system.time(df2[!duplicated(df2[c("PERMNO","date")]),]) 
# user system elapsed 
# 3.48 0.08 3.56 
相關問題