2017-08-26 94 views
1

我有一个传感器,可以测量一些事件(2个或更多类别+它们之间的白噪声)。 我想一个窗口添加到我的数据,每个窗口根据一些规则对事件的比例进行分类:dplyr:每班最常见的班+条件,不总结

  • 如果超过90%的白噪声窗口=>所有行必须标记白噪声
  • 如果低于90%的白噪声,在窗口

最有代表性的事件代码,我发现创建我窗口的方式(但如果你有更好的方法我很感兴趣这是不是很优雅) 我不知道如何应用规则并在初始数据中标记行。框架 N ote:我不想“汇总”我的数据,只需在每个窗口中添加一个重复的标签即可。 在该例子中我的期望的输出是添加标签“事件1”的所有窗口1周& 2的观察,“事件2”为窗口3,而“白噪声”为窗口4等

df = data.frame(value=c(1,1,1,2,2,1,2,1,3,2,3,6,7,8,4,2,1,1,1,2,1,1,2,1,3,3,1,5,8,9,9,8, 
          1,-4,-5,-7,-9,-3,-2,-1,1,1,1,1,1,2,1,1,1,2,1,1,1,2,2,1,2,3,5,7,7,7,6,2)) 
    df$class="white.noise"; df$class[df$value<1]<-"event2"; df$class[df$value>2]<-"event1" 

    # first create a window 
    window.size=13 
    df2 = df %>% mutate('window' = rep(1:100, each=window.size)[1:nrow(df)]) 

    # compute frequencies per window 
    df2 %>% group_by(window, class) %>% tally %>% mutate(n=n/window.size*100) 

回答

1

可以总结在一个单独的数据集中的每个窗口中选择相应的标签,&加入该回到原来的:

df2.sum <- df2 %>% 
    group_by(window, class) %>% 
    summarise(count = n()) %>% 
    mutate(prop = count/sum(count)) %>% 
    filter(any(class == "white.noise" & prop >= 0.9) | (class != "white.noise")) %>% 
    filter(prop == max(prop)) %>% 
    ungroup() %>% 
    rename(new.class = class) %>% select(window, new.class) 

> df2.sum 
# A tibble: 5 x 2 
    window new.class 
    <int>  <chr> 
1  4 white.noise 
2  5  event1 
3  3  event2 
4  1  event1 
5  2  event1 

> left_join(df2, df2.sum, by = "window") 
    value  class window new.class 
1  1 white.noise  1  event1 
2  1 white.noise  1  event1 
3  1 white.noise  1  event1 
4  2 white.noise  1  event1 
5  2 white.noise  1  event1 
6  1 white.noise  1  event1 
7  2 white.noise  1  event1 
8  1 white.noise  1  event1 
9  3  event1  1  event1 
10  2 white.noise  1  event1 
... 
+0

感谢您的回答很好,并且很抱歉地延迟回复;它按我的预期工作。 – agenis

1

一些增强Z.Lin的答案。我认为最好先将分类逻辑封装到单独的函数中。

library(dplyr) 

classify_window <- function(class_vec) { 
    is_white_noise <- class_vec == "white.noise" 
    if (mean(is_white_noise) > 0.9) { 
    return("white.noise") 
    } else { 
    class_no_noise <- class_vec[!is_white_noise] 
    class_table <- table(class_no_noise) 

    return(names(class_table)[which.max(class_table)]) 
    } 
} 

df2_summary <- df2 %>% 
    group_by(window) %>% 
    summarise(tag = classify_window(class)) 

df2_tagged <- df2 %>% left_join(y = df2_summary, by = "window") 
df2_tagged 
+0

非常感谢您的回复,并且很抱歉地延迟回复;它按我的预期工作。我想有没有简单的方法来做到这一点除了一些条件,然后合并.. – agenis