-1

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

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)

数据帧应逐行读取。

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

指定:装备 1 有等级 1 和等级 2 我想比较是否有列在等级 1 和等级 2 中的组件(在本例中:是)

装备 2 有 3 个等级,这里也没有列在第一、第二和第三等级的组合。

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

那么我想要的输出是什么?如果我得到一个输出,带有装备的数量,以及 TRUE 或 FALSE(如摘要命令),这就足够了

如果每个等级(在一个装备内)都列出了一个 Comps,则应该输出 TRUE

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

非常感谢您的努力。

查理

4

1 回答 1

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
于 2013-02-08T09:36:01.837 回答