根据dplyr groupby过滤行,汇总输出

时间:2016-07-11 17:41:30

标签: r dplyr

我有一个包含两列的数据集,metro,state。我在dplyr中给出以下命令,

data %>% group_by(metro, State) %>% summarise(count = n())

我得到以下输出,

metro           State         count 
A                OH            703
A                NJ              3
B                GA           1453
B                CA            456
B                WA            123

我现在想要过滤掉数据框中只有最大数量的行,而忽略剩余的行。我需要过滤掉相应的行。过滤掉以下命令的行后的输出应为

data %>% group_by(metro, State) %>% summarise(count = n())

   metro           State         count 
    A                OH            703
    B                GA           1453

每个地铁只有状态,其中最大数量的状态被删除。

以下是我的尝试,

data %>% group_by(metro, State) %>% filter(n() == max(n()))

但这再次给出了与输入相同的数据帧。

有人可以帮我这么做吗?我的输出应该是每个地铁应该有一个具有最大计数的唯一状态,并且应该删除剩余的状态条目。

由于

2 个答案:

答案 0 :(得分:4)

你需要一个双阶段分组,首先分组地铁和国家获得计数然后分组地铁并过滤掉不等于每个地铁内最大数量的计数:

    /*Function to calculate sequential numbers 
in the range between the arg values, both inclusive.*/
    function smallestCommons(arg1, arg2) {
     
       if(arg1>arg2) { // Swap arg1 and arg2 if arg1 is greater than arg2
          var temp = arg1;
          arg1 = arg2;
          arg2 =temp;
        }
      
      /*
      Helper function to calculate greatest common divisor (gcd)
      implementing Euclidean algorithm */
      function gcd(a, b) {
      	return b===0 ? a : gcd(b, a % b); 
       }
      
      /*
      Helper function to calculate lowest common multiple (lcm) 
of any two numbers using gcd function above */
       function lcm(a,b){
          return (a*b)/gcd(a,b);
         }
      
      var total = arg1; // copy min value
      for(var i=arg1;i<arg2;i++){
          total = lcm(total,i+1);
         }
      //return that total
      return total;
    }
    /*Yes, there are many solutions that can get the job done.
    Check this out, same approach but different view point.
    */
    console.log(smallestCommons(13,1)); //360360

答案 1 :(得分:0)

我们也可以使用data.table

library(data.table)
setDT(data)[,  count := .N , .(metro, state)][,  .SD[count == max(count)] , .(metro)]