根据变量名子集数据?

时间:2019-10-09 10:09:25

标签: r subset limit

我正在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函数,但是由于我有多个名称必须与限制匹配,因此我不确定从哪里开始。

1 个答案:

答案 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

如果不需要,您可以稍后删除列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))