Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 当某些条件适用时,允许最大数量的条目_R_Plyr_Data.table - Fatal编程技术网

R 当某些条件适用时,允许最大数量的条目

R 当某些条件适用时,允许最大数量的条目,r,plyr,data.table,R,Plyr,Data.table,我有一个包含大量条目的数据集。每个条目都属于某个ID(belongID),条目是唯一的(使用uniqID),但多个条目可以来自同一个源(sourceID)。也可能来自同一源的多个条目具有相同的belongID。为了对数据集进行研究,我必须去掉单个sourceID的条目,这些条目在1 belongID中出现5次以上。需要保留的最多5个条目是“时间”值最高的条目 为了说明这一点,我有以下示例数据集: belongID sourceID uniqID Time 1

我有一个包含大量条目的数据集。每个条目都属于某个ID(belongID),条目是唯一的(使用uniqID),但多个条目可以来自同一个源(sourceID)。也可能来自同一源的多个条目具有相同的belongID。为了对数据集进行研究,我必须去掉单个sourceID的条目,这些条目在1 belongID中出现5次以上。需要保留的最多5个条目是“时间”值最高的条目

为了说明这一点,我有以下示例数据集:

   belongID   sourceID uniqID   Time     
   1           1001     101       5            
   1           1002     102       5        
   1           1001     103       4        
   1           1001     104       3       
   1           1001     105       3     
   1           1005     106       2        
   1           1001     107       2       
   1           1001     108       2       
   2           1005     109       5                
   2           1006     110       5        
   2           1005     111       5        
   2           1006     112       5        
   2           1005     113       5      
   2           1006     114       4        
   2           1005     115       4        
   2           1006     116       3       
   2           1005     117       3                
   2           1006     118       3       
   2           1005     119       2        
   2           1006     120       2        
   2           1005     121       1      
   2           1007     122       1        
   3           1010     123       5        
   3           1480     124       2  
最后的例子应该是这样的:

   belongID   sourceID uniqID   Time     
   1           1001     101       5            
   1           1002     102       5        
   1           1001     103       4        
   1           1001     104       3       
   1           1001     105       3     
   1           1005     106       2        
   1           1001     107       2           
   2           1005     109       5                
   2           1006     110       5        
   2           1005     111       5        
   2           1006     112       5        
   2           1005     113       5      
   2           1006     114       4        
   2           1005     115       4        
   2           1006     116       3       
   2           1005     117       3                
   2           1006     118       3           
   2           1007     122       1        
   3           1010     123       5        
   3           1480     124       2     
文件中有更多的列包含数据条目,但选择必须完全基于时间。如本例所示,还可能出现具有相同belongID的sourceID的第5个和第6个条目具有相同的时间。在这种情况下,只需选择1,因为max=5


为了便于说明,这里的数据集在belongID和time上进行了很好的排序,但在真实的数据集中情况并非如此。你知道如何解决这个问题吗?我还没有遇到过类似的事情

说您的数据在
df
中。在此之后,将获得有序(按uniqID)输出:

tab <- tapply(df$Time, list(df$belongID, df$sourceID), length)
bIDs <- rownames(tab)
sIDs <- colnames(tab)
for(i in bIDs)
{
    if(all(is.na(tab[bIDs == i, ])))next
    ids <- na.omit(sIDs[tab[i, sIDs] > 5])
    for(j in ids)
    {
        cond <- df$belongID == i & df$sourceID == j
        old <- df[cond,]
        id5 <- order(old$Time, decreasing = TRUE)[1:5]
        new <- old[id5,]
        df <- df[!cond,]
        df <- rbind(df, new)
    }
}
df[order(df$uniqID), ]

tab使用
plyr
软件包将解决方案分成两行:

library(plyr)
x <- ddply(dat, .(belongID, sourceID), function(x)tail(x[order(x$Time), ], 5))
xx <- x[order(x$belongID, x$uniqID), ]

如果
dat
是您的数据帧:

do.call(rbind, 
        by(dat, INDICES=list(dat$belongID, dat$sourceID), 
           FUN=function(x) head(x[order(x$Time, decreasing=TRUE), ], 5)))

使用此方法的数据集有170.000多个条目和近30列

使用我的数据集对danas.zuokas、mplourde和Andrie提供的三个解决方案进行基准测试,得出以下结果:

danas.zuokas的解决方案:

   User     System  Elapsed 
   2829.569   0     2827.86
mplourde的解决方案:

   User     System  Elapsed 
   765.628  0.000   763.908
   User     System  Elapsed 
   984.989  0.000   984.010
奥迪的解决方案:

   User     System  Elapsed 
   765.628  0.000   763.908
   User     System  Elapsed 
   984.989  0.000   984.010

因此,我将使用mplourde的解决方案。谢谢大家!

这应该更快,使用:


旁白:建议在这个问题的各种答案中计算相同变量名的重复次数。您是否有过很多长的或类似的对象名称?

+1用于显示示例数据和预期结果。感谢您的解决方案,但是tmp对象来自何处?使用此方法时,我的输出(与您显示的结果相同)与输入相同。未应用每个belongID的sourceID最近最多5个条目的限制?@MaxvanderHeijden我的错误。代码修复。很好的和有效的书面解决方案。在我的示例数据集上非常有效。我不会在我的完整数据集上尝试所有的方法,然后做一点基准测试,然后我会选择最快的选项作为可接受的解决方案。我会尽快报告的!这些时间似乎很高。请和我的答案比较一下。