【问题标题】:Subsetting data based on variable name?基于变量名的子集数据?
【发布时间】:2019-10-09 10:09:25
【问题描述】:

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

【问题讨论】:

    标签: r subset limit


    【解决方案1】:

    如果您使用"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))
    

    【讨论】:

    • 谢谢你,当我运行它时,我收到错误消息:“中间错误(值,最小值,最大值):期望单个值:[extent=706]”你知道这是为什么吗?
    • @Issy 你现在可以检查更新的代码吗?我现在使用data.table::between
    猜你喜欢
    • 2013-06-09
    • 2018-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-12
    • 2017-10-08
    相关资源
    最近更新 更多