我有一個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]
但是,它不起作用。有任何進一步的建議?謝謝!
作爲「身份證」是獨一無二的,使用':='創建「時間」列 – akrun
如果你只是想通過保持時間>中位數(小時)子集的數據,那麼你可以使用這個:子集(df,df $小時>中位數(df $小時))。 – user108363
@ user108363他們想要根據'class'計算的中位數(或者其他),我想,因爲他們寫了'by = class'。 – Frank