2013-01-02 77 views
0

下的比較,我有一個小問題, 我有這些參數:2個條件

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

現在我想有一個比較,只是爲了一個Equip看,如果在第一rank的使用Components,是一樣的,在第二rank(只是由同一Equip):

在2種方式:

第一:是所有的組件一樣的嗎?

任何(最少1個)組件是否相同?

我需要一個高度自動的解決方案,因爲我的數據集有超過150k行。

想要的答案可能是一個只有布爾表達式的向量,包括TRUE和FALSE。

因此,對於上面的例子,

answer <- c(TRUE,TRUE)

由於裝備1個秩1成分:電機 「AND」 裝備1個秩2是組件:電機爲好。 (對於1種期望的方式爲例)

非常感謝您的幫助=)


我使用的評論功能,但我不能顯示的問題,因爲我想顯示的代碼。

請遺憾的是..

原始數據有更多然後2點,現在我想排名X秩X +在一個步驟1相結合,這是一個使用此我使用的福爾​​循環在功能,但它不工作任何想法?

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等結果一步到位

+0

什麼是你想要的結果嗎?您能否使用您發佈的數據向我們展示一個示例? – digEmAll

+0

對於相同的裝備(例如= 1),如果一個等級中的其中一個成分在另一個等級中重複,那麼您希望結果=真?那麼,每個Equip值只有一個布爾值? – digEmAll

+0

是的,這是我想要的第一步。第二個是如果所有組件都是相同的。但你明白我的意思,是的。 – Daniel

回答

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

在這裏我得到了comparaison結果和組件名稱

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" 
+0

你到底意味着什麼?獲取「再次使用」組件信息的想法非常有用。如果你的意思是這個,我想獲得這些信息。就像我在我的主題中講的那樣,它是一個大數據集,我必須總結一下,比如查找經常使用哪個組件,哪些不是。喜歡這個。它是我分析的第一步。 – Daniel

+0

數據的結構與給定示例中的結構相同,只有兩個不同的東西,還有兩個等級(但是我測試了它,這不是它不起作用的原因),另一個是,數據集非常大。我也認爲這是一個很好的解決方案(很難看)。還有另一種可能性嗎?真的非常感謝你的幫助=) – Daniel

+0

我真的不知道該怎麼做,仍然有錯誤代碼:「下標越界」會有一大堆向量能幫助你嗎? rle(df $ rank) 運行長度編碼 長度:int [1:8750] 5 1 4 34 2 29 1 8 1 8 ... values:int [1:8750] 1 2 3 1 2 1 2 1 2 1 ... > rle(df $ Equips) 運行長度編碼 長度:int [1:20268] 1 2 7 1 1 1 3 2 2 2 ... values:int [1:20268] 10024820 10025441 10040292 10045800 10050420 10062984 10071240 10083675 ​​10090325 10099139 ... – Daniel

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