R: Summarise and returm the number of unique occurrence in Column B while group_by Column A

Viewed 66

I have the below data, dfs_alltasks:

    by_hour task
1   0       Apple Receiving
2   0       Apple Receiving
3   0       Orange Receiving
4   0       Banana Receiving
5   0       Banana Receiving
6   0       Orange Receiving
7   1       Orange Receiving
8   1       Banana Receiving
9   1       Banana Receiving
10  1       Banana Receiving
11  1       Banana Receiving
12  1       Banana Receiving
13  1       Orange Receiving
14  2       Banana Receiving
15  3       Banana Receiving

I like to group_by the "by_hour" column while at the same time summarise and return the no. of task that occur during the group, I should get something like this:

    by_hour task              count
1   0       Apple Receiving   2
2   0       Orange Receiving  2
3   0       Banana Receiving  2
4   1       Orange Receiving  2
5   1       Banana Receiving  5
6   2       Banana Receiving  1
7   3       Banana Receiving  1

I have tried: dfs_alltasks %>% group_by(by_hour) %>% summarise_all(no_rows = length(task))

but im getting the error of "Error in list2(...) : object 'task' not found"

4 Answers

You don't need group by

library(tidyverse)

df_example <-
  structure(list(
    by_hour = c(0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1,
                1, 2, 3),
    task = c(
      "Apple Remaining",
      "Apple Remaining",
      "Orange Remaining",
      "Banana Remaining",
      "Banana Remaining",
      "Orange Remaining",
      "Orange Remaining",
      "Banana Remaining",
      "Banana Remaining",
      "Banana Remaining",
      "Banana Remaining",
      "Banana Remaining",
      "Orange Remaining",
      "Banana Remaining",
      "Banana Remaining"
    )
  ),
  class = "data.frame",
  row.names = c(NA, -15L))

df_example %>% 
  count(by_hour,task)
#>   by_hour             task n
#> 1       0  Apple Remaining 2
#> 2       0 Banana Remaining 2
#> 3       0 Orange Remaining 2
#> 4       1 Banana Remaining 5
#> 5       1 Orange Remaining 2
#> 6       2 Banana Remaining 1
#> 7       3 Banana Remaining 1

Created on 2020-06-06 by the reprex package (v0.3.0)

Try this :

library(tibble)
library(dplyr)
data <- tibble::tribble(
   ~by_hour, ~task,
  0 ,      "Apple Receiving",  
  0 ,      "Apple Receiving", 
  0 ,      "Orange Receiving",
  0 ,      "Banana Receiving",
  0 ,      "Banana Receiving",
  0 ,      "Orange Receiving",
  1 ,      "Orange Receiving",
  1 ,      "Banana Receiving",
  1 ,      "Banana Receiving",
  1 ,      "Banana Receiving",
  1 ,      "Banana Receiving",
  1 ,      "Banana Receiving",
  1 ,      "Orange Receiving",
  2 ,      "Banana Receiving",
  3 ,      "Banana Receiving")
data %>% group_by(by_hour,task) %>% summarize(count=n()) %>% ungroup()

Please consider providing a sample of your data using dput()

df <- structure(list(by_hour = c(0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 
1, 2, 3), task = c("Apple Remaining", "Apple Remaining", "Orange Remaining", 
"Banana Remaining", "Banana Remaining", "Orange Remaining", "Orange Remaining", 
"Banana Remaining", "Banana Remaining", "Banana Remaining", "Banana Remaining", 
"Banana Remaining", "Orange Remaining", "Banana Remaining", "Banana Remaining"
)), class = "data.frame", row.names = c(NA, -15L))

You can use the dplyr package and group_by for your variables.

library(dplyr)
df %>% 
  group_by(by_hour, task) %>% 
  count %>% 
  ungroup

Result

  by_hour task       n
    <dbl> <chr>  <int>
1       0 Apple      2
2       0 Banana     2
3       0 Orange     2
4       1 Banana     5
5       1 Orange     2
6       2 Banana     1
7       3 Banana     1

We can also use

library(data.table)
setDT(df)[, .(n = .N), .(by_hour, task)]
Related