2017-08-21 138 views
1

我有一個R中的data.table按一列的值進行分組,並在每個組中找到異常值。但我需要保持ID列(不包括在聚合)。例如,對於下面的數據表a,我希望按類查找小時數的孤立點,並將其輸出爲相應的id。將data.table聚合成一列,並在結果中保留另一個id列

 Hours  id class 
1: 100.000 30298340  M 
2: 4.776 30310183  M 
3: 1.560 30312576  M 
4: 11.520 30336159  M 
5: 3.288 30331383  M 
6: 6.552 30364533  M 
7: 5.064 30365224  M 
8: 27.768 30365394  C 
9: 4.992 30365211  M 
10: 25.536 30365603  M 
11: 8.568 30337051  M 
12: 5.112 30337052  C 
13: 2.352 30284703  M 
14: 23.784 30325405  M 
15: 16.464 30327152  M 
16: 24.336 30351237  M 
17: 3.192 30352117  M 
18: 24.312 30324926  M 
19: 23.160 30325670  M 
20: 4.176 30324906  M 

然後我用下面的代碼找出離羣點。

temp<-a[,.(Hours=boxplot.stats(Hours,coef=3,do.conf=F)$out,M=boxplot.stats(Hours,do.conf=F 
)$stats[3]),by=class] 

temp [Hours> M]會給我高於中位數和中位數的異常值作爲參考。

 class Hours M 
    1:  M 100 7.56 

但是,我怎樣才能改變聚合線,以包括異常行的ID?

由於我的原始表非常大,我不想將temp與原始數據合併。另外,因爲這只是大型現有程序的一小部分,所以我試圖保留帶有id列的臨時結果的主結構,以便temp可以傳遞到下一個計算塊中。理想情況下,有沒有簡單的方法來調整data.table聚合線來滿足我的要求?謝謝!!!


以下是相同情況下的其他問題。現在,如果我在原始數據中添加了3列,即年齡,性別等,我如何將它們都保存在離羣值輸出中?我可以簡單地重複Eric的代碼編號與其他變量替換和增加在data.table步:

age=age[which(Hours %in% boxplot.stats(Hours, coef = 3, do.conf = FALSE)$out)], 
gender=gender[which(Hours %in% boxplot.stats(Hours, coef = 3, do.conf = FALSE)$out)], 

但如果有更多的列添加這將是一個繁瑣的工作。我正在考慮做以下事情:

keyname<-c("age", "gender","id") 
    temp <- a[, .(Hours = boxplot.stats(Hours, coef = 3, do.conf = FALSE)$out, 
      M = boxplot.stats(Hours, do.conf = FALSE)$stats[3], 
      lapply(c(1:length(keyname)),function(x) keyname[x]=get(keyname[x])[which(Hours) %in% boxplot.stats(Hours, coef = 3, do.conf = FALSE)$out)]), 
     by = class] 

但是,它不起作用。有任何進一步的建議?謝謝!

+1

作爲「身份證」是獨一無二的,使用':='創建「時間」列 – akrun

+0

如果你只是想通過保持時間>中位數(小時)子集的數據,那麼你可以使用這個:子集(df,df $小時>中位數(df $小時))。 – user108363

+0

@ user108363他們想要根據'class'計算的中位數(或者其他),我想,因爲他們寫了'by = class'。 – Frank

回答

0

使用which和子集來創建列。

temp <- a[, .(Hours = boxplot.stats(Hours, coef = 3, do.conf = FALSE)$out, 
       M = boxplot.stats(Hours, do.conf = FALSE)$stats[3], 
       id = id[which(Hours %in% boxplot.stats(Hours, coef = 3, do.conf = FALSE)$out)]), 
      by = class] 

> temp 
    class Hours  M  id 
1:  M 100 7.56 30298340 
2:  C NA 16.44  NA 

> temp[Hours > M] 
    class Hours M  id 
1:  M 100 7.56 30298340 
+0

謝謝埃裏克瓦特。這正是我想要的,簡單而有效。它確實在data.table聚合步驟中添加了想要的id列。欣賞它! – DrX

+0

你能幫我多一點嗎? @EricWatt我在原始文章中添加了一個額外的問題。我還有7個專欄。我認爲你的解決方案仍然可以工作,但是它需要在data.table步驟中使用超長的重複代碼。有沒有更簡單的方法(至少有一個讓代碼看起來更乾淨)?謝謝! – DrX

+0

如果每個id的列都是唯一的,那麼像'age'和'gender'這樣的列看起來應該是這樣的,你可以使用merge。在完成上面的'temp'表之後,嘗試'合併(temp,a [,。(id,age,gender)],by =「id」,all。x = TRUE)' –

相關問題