基于变量名子集数据?

Subsetting data based on variable name?

我在 R 中工作。我有一个大型数据集(超过 700 'Name'),其中一个子集如下所示:

Name             Value

Harris           64
Harris           78
Harris           4
Jackson          102
Jackson          170
Drew             75
Smith            143
Smith            38

我想编写一个函数,根据我的一组限制,将每个 'Name' 的值标记为异常值:

Name            Limit
Harris           0 - 70
Jackson          0 - 150
Drew             0 - 80
Smith            0 - 70

我想根据限制说,如果有任何值超出它们,则生成一个新的 table 将这些值标记为异常值。我想这是一个新列,其中 '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   

如果我只用一个 'Name' 来做到这一点,我会使用 subset 函数,但是由于我有多个名称必须符合我的限制,所以我不确定在哪里开始。

如果您使用 "Name" 以及限制的最小值和最大值创建限制 table,您可以对其执行 left_join,然后使用 [=14= 检查异常值].

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

如果不需要,您可以稍后删除 minmax 列。

数据

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