2017-06-02 43 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 
相关问题