R - dplyr汇总和清理具有多个组的数据框

时间:2017-08-30 01:38:43

标签: r

背景

我试图过滤的大数据框架,但不正确的分组使其变得困难。想象一下,您有一个具有分层类别的杂货店的销售信息。香蕉出现3次:2次"水果"并且一旦作为"肉"。我知道"肉"销售实际上发生了所以我不想摆脱它,但它弄乱了我过滤的汇总数据(比如我只想保持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&amp; AVG&lt; 10然后放弃其他保留)。

我最好尝试分别进行均值/计数然后添加最大的x2?提前致谢!

2 个答案:

答案 0 :(得分:0)

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

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())

答案 1 :(得分:0)

更新

which.max默认选择第一个最大值,因此如果我们需要选择具有最大值的最后一个条目,我们只需rev e table条目,然后选择最大值。

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

原始答案

我们可group_by x1并选择x2最长时间,计算x3的平均值并计算行数(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