-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)

データフレームは1行ずつ読み取る必要があります。

私の問題は次のとおりです。非常に大きなデータセットがあり、1つの装備のコンプがすべてのランクで同じであるかどうかを確認したいと思います。

指定するには:機器1はランク1と2を持っていますランク1とランク2にリストされているコンポーネントがあるかどうかを比較したい(この例では:YES)

装備2は3つのランクを獲得しており、ここにも、1、2、3番目のランクにリストされているコンプはありません。

Equips 5は4つのランクを獲得しており、はい、すべてのランクにあるComps、つまり「Lichtmaschine」があります。

それで、私の望ましい出力は何ですか?出力があれば、装備の数と、TRUEまたはFALSE(要約コマンドのように)で十分です。

すべてのランク(1つの装備内)にリストされているコンプがある場合、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 に答える