【问题标题】:Check if means break certain limits R检查装置是否打破某些限制 R
【发布时间】:2017-11-15 11:54:27
【问题描述】:

我有一个 100x2 数据集,其中第一列标识样本,第二列代表测量值。每个样本的大小为 4,因此数据集如下所示:

V1  V2
1   125.8
1   128.4
1   129.0
1   121.0
2   125.2
2   127.0
2   130.4
2   124.6
3   121.8
3   126.8
..  ..

我使用以下方法计算了每个样本的平均值:

df2 = subset(data, select = c(2))
means =  t(sapply(split(df2,rep(seq(1,nrow(df2),4),each=4)),colMeans)) 

所以我现在有一个包含 25 个均值的向量。我想检查这些方法中的每一个是否超出某些限制(定义如下),然后返回一个对象,其中包含样本 ID、样本的平均值以及它打破的限制的​​信息,将输出设置为类“谢尔特”:

warning_upper: 130.4
action_upper: 132.1
warning_lower: 123.6
action_lower: 121.9

【问题讨论】:

    标签: r


    【解决方案1】:

    在 AntoniosK 发布他的解决方案的同时,我正在研究解决方案。

    我也使用了dplyr 包:

    library(dplyr)
    df1 <- read.table(text = "V1  V2
    1   125.8
    1   128.4
    1   129.0
    1   121.0
    2   125.2
    2   127.0
    2   130.4
    2   124.6
    3   121.8
    3   126.8
    3   133.8
    3   144.5", header = TRUE)
    
    warn_upper <- 130.4
    action_upper  <- 132.1
    warn_lower <- 123.6
    action_lower  <- 121.9
    
    df1 %>%
            group_by(V1) %>%
            summarize(smean = mean(V2)) %>%
            mutate(warn_hi   = (smean - warn_upper) > 0 ,
                   action_hi = (smean - action_upper ) > 0,
                   warn_lo   = (-1 * (smean - warn_lower)) > 0 ,
                   action_lo = (-1 * (smean - action_lower )) > 0) %>%
            mutate(klass = if_else(warn_lo | action_lo | 
                                   warn_hi | action_hi, true = "shewart", false="" ))
    

    结果:

         V1 smean warn_hi action_hi warn_lo action_lo  klass
      <int> <dbl>   <lgl>     <lgl>   <lgl>     <lgl>   <chr>
    1     1 126.0   FALSE     FALSE   FALSE     FALSE        
    2     2 126.8   FALSE     FALSE   FALSE     FALSE        
    3     3 131.7    TRUE     FALSE   FALSE     FALSE shewart
    

    【讨论】:

    • 这太好了 - 谢谢。 “klass”是否特定于 dplyr 用于定义一个类?我以前没见过。
    • 这不是那么重要,您可能可以将该列名称称为“类”。我刚刚试图避免与内置函数名称发生名称冲突。试试 class(df1) 或许能明白我的意思。 colname smean 相同。
    【解决方案2】:

    我稍微更改了您提供的值,以确保该过程可以正确发现您想要的模式。

    library(dplyr)
    
    # example dataset
    df = read.table(text = "
    V1  V2
    1   195.8
    1   128.4
    1   129.0
    1   121.0
    2   125.2
    2   127.0
    2   125.4
    2   114.6
    ", header=T)
    
    # function to return info based on a value
    f = function(x) {
      ifelse(x < 121.9, "below action",
             ifelse(x < 123.6, "below warning", 
                    ifelse(x > 132.1, "above action",
                           ifelse(x > 130.4, "above warning", "normal"))))
      }
    
    
    df %>%
      group_by(V1) %>%                      # for each V1
      summarise(MeanValue = mean(V2)) %>%   # calculate means
      mutate(info = f(MeanValue))           # use the function to get relevant info
    
    # # A tibble: 2 x 3
    #      V1 MeanValue          info
    #   <int>     <dbl>         <chr>
    # 1     1    143.55  above action
    # 2     2    123.05 below warning
    

    【讨论】:

      猜你喜欢
      • 2022-11-29
      • 1970-01-01
      • 2014-06-26
      • 1970-01-01
      • 2020-03-20
      • 1970-01-01
      • 2012-06-04
      • 1970-01-01
      • 2016-05-17
      相关资源
      最近更新 更多