我想創建一個列來檢測大型資料集中的例外值。資料集的一個樣本是
物品 | 成本 |
---|---|
預約一個 | 5.0 |
預約一個 | 3.5 |
預約一個 | 12.0 |
書 B | 6.0 |
書 B | 8.0 |
C書 | 3.0 |
書 B | 6.0 |
C書 | 3.5 |
預約一個 | 3.8 |
書 B | 13.0 |
預約一個 | 5.1 |
書 B | 7.0 |
預約一個 | 11.5 |
C書 | 3.8 |
預約一個 | 5.5 |
預約一個 | 6.5 |
書 B | 13.5 |
預約一個 | 5.5 |
C書 | 3.5 |
預約一個 | 1.2 |
df = structure(list(Item = structure(c(1L, 1L, 1L, 2L, 2L, 3L, 2L,
3L, 1L, 2L, 1L, 2L, 1L, 3L, 1L, 2L, 2L, 1L, 3L, 1L), .Label = c("Book A",
"Book B", "Book C"), class = "factor"), Cost = c(5, 3.5, 12,
6, 8, 3, 6, 3.5, 3.8, 13, 5.1, 7, 11.5, 3.8, 5.5, 6.5, 13.5,
5.5, 3.5, 1.2)), class = "data.frame", row.names = c(NA, -20L
))
我想檢測例外值(例如,如果成本位元定專案的多數平均值高或低 60%)并輸出如下列
物品 | 成本 | 例外值(是/否) |
---|---|---|
預約一個 | 5.0 | ? |
預約一個 | 3.5 | ? |
預約一個 | 12.0 | 是 |
書 B | 6.0 | ? |
書 B | 8.0 | ? |
C書 | 3.0 | ? |
書 B | 6.0 | ? |
C書 | 3.5 | ? |
預約一個 | 3.8 | ? |
書 B | 13.0 | 是 |
預約一個 | 5.1 | ? |
書 B | 7.0 | ? |
預約一個 | 11.5 | 是 |
C書 | 3.8 | ? |
預約一個 | 5.5 | ? |
預約一個 | 6.5 | ? |
書 B | 13.5 | 是 |
預約一個 | 5.5 | ? |
C書 | 3.5 | ? |
預約一個 | 1.2 | 是 |
提前致謝!
uj5u.com熱心網友回復:
library(dplyr)
df %>%
summarise(outlier = mean(Cost),
offset = outlier * 0.6,
higher_value = outlier offset,
lower_value = outlier - offset) %>%
bind_cols(df) %>%
transmute(Item, Cost,
Outlier = ifelse(Cost < lower_value | Cost > higher_value, 'Y', 'N'))
# Item Cost Outlier
#1 Book A 5.0 N
#2 Book A 3.5 N
#3 Book A 12.0 Y
#4 Book B 6.0 N
#5 Book B 8.0 N
#6 Book C 3.0 N
#7 Book B 6.0 N
#8 Book C 3.5 N
#9 Book A 3.8 N
#10 Book B 13.0 Y
#11 Book A 5.1 N
#12 Book B 7.0 N
#13 Book A 11.5 Y
#14 Book C 3.8 N
#15 Book A 5.5 N
#16 Book B 6.5 N
#17 Book B 13.5 Y
#18 Book A 5.5 N
#19 Book C 3.5 N
#20 Book A 1.2 Y
如果您想分別找到每個的例外值Item
。
df %>%
group_by(Item) %>%
summarise(outlier = mean(Cost),
offset = outlier * 0.6,
higher_value = outlier offset,
lower_value = outlier - offset) %>%
left_join(df, by = 'Item') %>%
transmute(Item, Cost,
Outlier = ifelse(Cost < lower_value | Cost > higher_value, 'Y', 'N'))
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/496128.html
下一篇:獲取陣列長度并推入每個物件