我正在R中工作。我有一个大型数据集(具有700多个“名称”),子集看起来像这样:
Name Value
Harris 64
Harris 78
Harris 4
Jackson 102
Jackson 170
Drew 75
Smith 143
Smith 38
我想编写一个函数,根据我拥有的一组限制将值标记为每个“名称”的异常值:
Name Limit
Harris 0 - 70
Jackson 0 - 150
Drew 0 - 80
Smith 0 - 70
我想根据限制说,如果有任何值不在限制之内,则生成一个新表,将其标记为异常值。我想象这是一个新列,对于异常值使用'TRUE',下面是示例:
Name Value Outlier
Harris 64 FALSE
Harris 78 TRUE
Harris 4 FALSE
Jackson 102 FALSE
Jackson 170 TRUE
Drew 75 FALSE
Smith 143 TRUE
Smith 38 FALSE
如果仅使用一个“名称”来执行此操作,我将使用subset
函数,但是由于我有多个名称必须与限制匹配,因此我不确定从哪里开始。
答案 0 :(得分:0)
如果您创建一个包含"Name"
以及限额的最小值和最大值的限额表,则可以对其进行left_join
,然后使用between
检查异常值。
library(dplyr)
df %>%
left_join(limits, by = "Name") %>%
mutate(Outlier = !data.table::between(Value, min, max))
# Name Value min max Outlier
#1 Harris 64 0 70 FALSE
#2 Harris 78 0 70 TRUE
#3 Harris 4 0 70 FALSE
#4 Jackson 102 0 150 FALSE
#5 Jackson 170 0 150 TRUE
#6 Drew 75 0 80 FALSE
#7 Smith 143 0 70 TRUE
#8 Smith 38 0 70 FALSE
如果不需要,您可以稍后删除列min
和max
。
数据
df <- structure(list(Name = structure(c(2L, 2L, 2L, 3L, 3L, 1L, 4L,
4L), .Label = c("Drew", "Harris", "Jackson", "Smith"), class = "factor"),
Value = c(64L, 78L, 4L, 102L, 170L, 75L, 143L, 38L)),
class = "data.frame", row.names = c(NA, -8L))
limits <- structure(list(Name = structure(c(2L, 3L, 1L, 4L), .Label = c("Drew",
"Harris", "Jackson", "Smith"), class = "factor"), min = c(0L,
0L, 0L, 0L), max = c(70L, 150L, 80L, 70L)), class = "data.frame",
row.names = c(NA, -4L))