我有一个看起来像这样的数据集(“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。
欢迎任何/所有建议。提前谢谢!
此致 艾米
答案 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"