0

少し問題があります。次のパラメーターがあります。

df <- data.frame(Equip = c(1,1,1,1,1,2,2,2,2,2),
                 Notif = c(1,1,1,2,2,3,3,3,3,4),
                 Component = c("Dichtung","Motor","Getriebe","Service","Motor","Lüftung","Dichtring","Motor","Getriebe","Dichtring"),
                rank= c(1 , 1 , 1 , 2 , 2 , 1 , 1 , 1 , 1 , 2))

ここで、 1 つだけを探して比較したいと思います。最初にEquip使用された が 2 番目と同じである場合(同じだけ):ComponentsrankrankEquip

2 つの方法で:

1 つ目: すべてのコンポーネントは同じですか?

(最小 1) コンポーネントは同じですか?

私のデータセットには 15 万行を超える行があるため、高度な自動ソリューションが必要です。

望ましい答えは、TRUE と FALSE を含むブール式だけのベクトルである可能性があります。

したがって、上記の例では、

answer <- c(TRUE,TRUE)

ランク 1 の装備 1 コンポーネント: モーター "AND" ランク 1 の装備 2 もコンポーネント: モーターです。(1つの望ましい方法の例)

ご協力ありがとうございました =)


コメント機能を使ったのですが、コードを見せたいので問題が見れません。

ご無沙汰しております..

元のデータには2つ以上のランクがあり、ランクxとランクx + 1を1つのステップで結合したいのですが、これは関数でfoorループを使用するために使用されますが、うまくいきませんか?

a <- lapply(split(df,df$Equips),function(x){
 for(i in 1:8){
  ll <- split(x,x$rank) 
if(length(ll)>i )
 ii <- intersect(ll[[i]]$Comps,ll[[i+1]]$Comps ) 
else ii <- NA c(length(ii)> 0 && !is.na(ii),ii) 
} 
})
 b <- unlist(a) 
c <- table(b,b) 
rowSums(c)

私はそれのために何ができるか考えています (主なアイデアは、1-2,2-3,3-4 などの結果を 1 つのステップで取得することです!

4

2 に答える 2

0

考えられる解決策は次のとおりです。

df <- data.frame(Equip = c(1,1,1,1,1,2,2,2,2,2),
                 Notif = c(1,1,1,2,2,3,3,3,3,4),
                 Component = c("Dichtung","Motor","Getriebe","Service","Motor","Lüftung","Dichtring","Motor","Getriebe","Dichtring"),
                 rank= c(1 , 1 , 1 , 2 , 2 , 1 , 1 , 1 , 1 , 2))


allComponents <- function(subDf){
  setequal(subDf[subDf$rank==1,'Component'],subDf[subDf$rank==2,'Component'])
}

anyComponents <- function(subDf){
  length(intersect(subDf[subDf$rank==1,'Component'],subDf[subDf$rank==2,'Component'])) > 0
}

# all components are equal
res1 <- by(df,INDICES=df$Equip,FUN=allComponents)
# at least one component equal
res2 <- by(df,INDICES=df$Equip,FUN=anyComponents)

as.vector(res1)
> FALSE, FALSE

as.vector(res2)
> TRUE, TRUE
于 2013-01-02T10:57:29.487 に答える
0

パッケージplyrはグループ操作に適しています

dat.r <- dlply(df ,.(Equip),function(x){      # I split by Equipe
  ll <- split(x,x$rank)                       # I split by rank

  if(length(ll)> 1)
    ii <- intersect(ll[[1]]$Comps,ll[[2]]$Comps ) ## test intersection
  else 
    ii <- NA
  c(length(ii)> 0 && !is.na(ii),ii)                        ## the result
})

ここで、比較結果とコンポーネント名を取得します

dat.r
$`1`
[1] "TRUE"  "Motor"

編集:ここにベースパッケージの結果(インターネットなし)

lapply(split(df,df$Equip),function(x){      # I split by Equipe
  ll <- split(x,x$rank)                       # I split by rank
  if(length(ll)> 1)
    ii <- intersect(ll[[1]]$Comps,ll[[2]]$Comps ) ## test intersection
  else 
    ii <- NA
  c(length(ii)> 0 && !is.na(ii),ii)                                          ## the result
})

$`1`
[1] "TRUE"  "Motor"

$`2`
[1] "TRUE"      "Dichtring"
于 2013-01-02T11:57:22.670 に答える