在R中清理多余的时间顺序团队数据

时间:2014-09-22 22:56:10

标签: r data-cleansing

我有一个看起来像这样的数据集(“dat”):

Team     Person1    Person2     Person3     Person4     Person5     Person6     Person7     Person8
1195880  37506459   37470284    NA          NA          NA          NA          NA          NA
6592553  30113892   33080542    21537647    32294183    NA          NA          NA          NA
6593701  697917     22860611    NA          NA          NA          NA          NA          NA
9595288  24433487   32370872    11522125    363290      8877040     22313302    32432767    NA
1595882  12318169   25645992    NA          NA          NA          NA          NA          NA
6595978  24433487   32370872    11522125    363290      8877040     22313302    32432767    NA
7545798  24433487   32370872    11522125    363290      8877040     22313302    NA          NA
2095820  12318169   25645992    37506459 

dat按时间顺序排列。从数据集的开头(即最早的时间点)开始,我想要消除以下任何一种情况:a)完全相同的一群人在以后的某个时间点组成团队和/或b)子集以前组建的团队聚集在一起。在这两种情况下,我都希望保留较早的分组并消除最近的分组。

例如,在我的示例数据集中,团队6595978和7545798都应该被删除; 6595978团队是团队9595288的精确复制品(按时间顺序排在前面),团队7545798是团队9595288的子集。但是,团队2095820不应该被淘汰;虽然团队2095820包含先前列出的团队1595882的所有成员,但由于添加了新成员,人员37506459,应保留团队2095820。

欢迎任何/所有建议。提前谢谢!

此致 艾米

1 个答案:

答案 0 :(得分:1)

你有几行?这是解决问题的一种效率很低的方法,但如果您的数据大小合理,它可能会起作用。

bad<-numeric();
for(i in 2:nrow(dd)) {
    for(j in 1:(i-1)) {
        if (all(dd[i,-1] %in% dd[j, -1])) {
            bad <- c(bad, i)
            break;
        }
    }
}
dd[bad, ]
#      Team  Person1  Person2  Person3 Person4 Person5  Person6  Person7 Person8
# 6 6595978 24433487 32370872 11522125  363290 8877040 22313302 32432767      NA
# 7 7545798 24433487 32370872 11522125  363290 8877040 22313302       NA      NA

这是使用reshape2库的另一个想法。在这里,我们要确保Team列是行的给定顺序的因子,而不是按数字/字母顺序排序。

dd$Team<-factor(dd$Team, levels=unique(dd$Team))

library(reshape2)
mm<-acast(melt(dd, "Team", na.rm=T), Team~value, length)
bad<-combn(1:nrow(mm), 2, function(z) {
    sum(mm[z[1],] == 1 & mm[z[1],] == mm[z[2],]) == sum(mm[z[2],]==1)
})
bad<-unique(combn(1:nrow(mm), 2)[2, bad])
levels(dd$Team)[bad]
# [1] "6595978" "7545798"