2017-08-30 49 views
0

背景:,我试图来过滤,但不正确的分组都使其难以的R - dplyr总结和清洁用多组数据帧

我大的数据帧。想象一下,你有一个具有分层类别的杂货店的销售信息。香蕉出现3次:2次为“水果”,1次为“肉”。我知道实际上发生了“肉类”销售,所以我不想摆脱它,但它弄乱了我过滤的汇总数据(例如,我只想保留具有3个或更多实例的分组,但香蕉会消失)。

重现性实施例

x1 <- c('a','a','a','b','b','b') 
x2 <- c(1,1,4,5,2,2) 
x3 <- c(10,11,12,13,14,15) 
df = data.frame(x1,x2,x3) 

summarized = df %>% 
    group_by(x1, x2) %>% 
    summarize(Avg = mean(x3), 
      Times = n()) 

创建:

 x1 x2 Avg Times 
1  a  1 10.5  2 
2  a  4 12.0  1 
3  b  2 14.5  2 
4  b  5 13.0  1 

分组(A,1)发生超过(A,4),所以我知道(A,1)是正确的( (b,2)与(b,5)相同)。我在寻找我的数据帧成为:

 x1 x2 Avg Times 
1  a  1 11  3 
2  b  2 14  3 

x2重要的是我保持,因为我的条件格式是基于(即,如果X2 == 1 & AVG < 10再落别人保持)。

我最好试图做平均/计数分开,然后加上最大的X2?提前致谢!

+0

试着给出一致的例子。虽然描述你用“香蕉”,“肉”来解释它,但在你可重复的例子中,我没有找到它们。 –

+0

我注意到你迄今在SO上提出的6个问题没有接受任何答案。请考虑接受解决您的疑问的答案。 –

回答

0

更新

which.max默认选择第一个最大的,所以在情况下,如果我们需要选择最大值的最后一个条目,我们只需要rev erse table条目,然后选择最大值。

df %>% 
    group_by(x1) %>% 
    summarise(x2 = names(which.max(rev(table(x2)))), 
      x3 = mean(x3), 
      Times = n()) 

原来的答案

我们可以group_byx1并选择x2发生了最大时间,计算平均值和计数行(n()),每个组的数量。

library(dplyr) 
df %>% 
    group_by(x1) %>% 
    summarise(x2 = names(which.max(table(x2))), 
      x3 = mean(x3), 
      Times = n()) 


#  x1 x2 x3 Times 
# <fctr> <chr> <dbl> <int> 
#1  a  1 11  3 
#2  b  2 14  3 
+0

感谢您的帮助!什么是.max处理关系的默认方式?即当我在最后添加另一行(a,4)时,此函数仍然在汇总表中给出(a,2)。如果有一条平行线(2条(a,2)和2条(a,4条)),有没有办法将它切换到最后一排? – CoolGuyHasChillDay

+0

@CoolGuyHasChillDay我已经更新了相应的答案。请看一看。 –

0

如果你知道每个x1组中最常见的x2是正确的,你可以这样做:

correct_cats = df %>% 
    group_by(x1) %>% 
    count(x2) %>% 
    # Find most common x2 
    top_n(1, n) %>% 
    select(-n) 

df = df %>% 
    # Drop current x2 
    select(-x2) %>% 
    # Merge in corrected x2 
    left_join(correct_cats, by = 'x1') 

summarized = df %>% 
    group_by(x1, x2) %>% 
    summarize(Avg = mean(x3), 
       Times = n())