检查平等

时间:2013-02-08 09:24:03

标签: r subset

我想检查数据集的相等性。数据集看起来像这样

Equips <- c(1,1,1,2,2,2,3,3,3,3,3,3,3,4,4,4,4,4,4,5,5,5,5,5,5,5,6,7,8)
Notifs <- c(10,10,20,55,63,67,71,73,73,73,81,81,83,32,32,32,32,
47,48,45,45,45,51,51,55,56,69,65,88)
Comps <- c("Motor","Ventil","Motor","Gehäuse","Ventil","Motor","Steuerung","Motor",
"Ventil","Gehäuse","Gehäuse","Ventil","Motor","Schraube","Motor","Festplatte",
"Heizgerät","Motor","Schraube","Schraube","Lichtmaschine","Bremse","Lichtmaschine",
"Schraube","Lichtmaschine","Lichtmaschine","Motor","Ventil","Schraube")
rank <- c(1,1,2,1,2,3,1,2,2,2,3,3,4,1,1,1,1,2,3,1,1,1,2,2,3,4,1,1,1)

df <- data.frame(Equips,Notifs,Comps,rank)

应逐行读取数据帧。

我的问题如下: 我有一个非常大的数据集,我想看看一个Equips中的Comps在所有等级中是否相同。

要指定:如果在排名1和排名2中列出了一个组件(在此示例中为:是),则公平1已获得排名1和2我想要进行比较

Equips 2有3个等级,这里也没有列出第一,第二和第三等级的Comps。

Equips 5有4个等级,是的,这里是每个等级的Comps:即“Lichtmaschine”。

那么我想要的输出是什么? 如果我得到一个输出,它的数量为Equips,并且为TRUE或FALSE(如汇总命令)就足够了

如果在每个等级(一个等级内)中列出了一个Comps,则应该是输出

还有一些注意事项:数据集非常大,所以我需要一个自动化版本,如果可能的话,只需使用没有任何包的标准R程序。

非常感谢您的努力。

查理

1 个答案:

答案 0 :(得分:2)

以下是使用plyr包的答案:

library(plyr)
ddply(df, .(Equips), function(d) {
  nb.comps <- length(unique(d$rank))
  tab <- table(d$rank, d$Comps) > 0
  tab <- margin.table(tab, 2)
  return(sum(tab>=nb.comps)>0)
})

给出了:

  Equips    V1
1      1  TRUE
2      2 FALSE
3      3 FALSE
4      4 FALSE
5      5  TRUE

如果您确实不想使用plyr,可以使用by功能:

by(df, df$Equips, function(d) {
  nb.comps <- length(unique(d$rank))
  tab <- table(d$rank, d$Comps) > 0
  tab <- margin.table(tab, 2)
  return(sum(tab>=nb.comps)>0)
})

df$Equips: 1
[1] TRUE
-------------------------------------------------------- 
df$Equips: 2
[1] FALSE
-------------------------------------------------------- 
df$Equips: 3
[1] FALSE
-------------------------------------------------------- 
df$Equips: 4
[1] FALSE
-------------------------------------------------------- 
df$Equips: 5
[1] TRUE

如果您想总结结果,可以执行以下操作:

result <- by(df, df$Equips, function(d) {
  nb.comps <- length(unique(d$Comps))
  tab <- table(d$rank, d$Comps) > 0
  tab <- margin.table(tab, 2)
  return(sum(tab>=nb.comps)>0)
})


data.frame(nb.equips=dim(result), nb.matched=sum(result))

给出了:

  nb.equips nb.matched
1         5          2