R 当某些条件适用时,允许最大数量的条目
我有一个包含大量条目的数据集。每个条目都属于某个ID(belongID),条目是唯一的(使用uniqID),但多个条目可以来自同一个源(sourceID)。也可能来自同一源的多个条目具有相同的belongID。为了对数据集进行研究,我必须去掉单个sourceID的条目,这些条目在1 belongID中出现5次以上。需要保留的最多5个条目是“时间”值最高的条目 为了说明这一点,我有以下示例数据集:R 当某些条件适用时,允许最大数量的条目,r,plyr,data.table,R,Plyr,Data.table,我有一个包含大量条目的数据集。每个条目都属于某个ID(belongID),条目是唯一的(使用uniqID),但多个条目可以来自同一个源(sourceID)。也可能来自同一源的多个条目具有相同的belongID。为了对数据集进行研究,我必须去掉单个sourceID的条目,这些条目在1 belongID中出现5次以上。需要保留的最多5个条目是“时间”值最高的条目 为了说明这一点,我有以下示例数据集: belongID sourceID uniqID Time 1
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我的错误。代码修复。很好的和有效的书面解决方案。在我的示例数据集上非常有效。我不会在我的完整数据集上尝试所有的方法,然后做一点基准测试,然后我会选择最快的选项作为可接受的解决方案。我会尽快报告的!这些时间似乎很高。请和我的答案比较一下。