I want to group a data frame by a column (owner) and output a new data frame that has counts of each type of a factor at each observation. The real data frame is fairly larg
If you wanted to forego the dplyr
, you can split into lists.
df <- split(df, list(df[[obs1]], df[[obs2]])
If you wanted the count
, you just create an sapply
or lapply
call to run through the lists and get the count of each one. Or literally any other function you want.
You could use tidyr
with dplyr
library(dplyr)
library(tidyr)
df %>%
gather(observation, Val, obs1:obs2) %>%
group_by(owner,observation, Val) %>%
summarise(n= n()) %>%
ungroup() %>%
spread(Val, n, fill=0)
which gives the output
# owner observation loud quiet
#1 0 obs1 1 1
#2 0 obs2 2 0
#3 1 obs1 1 1
#4 1 obs2 0 2
In 2017 the answer is
library(dplyr)
library(tidyr)
gather(df, key, value, -owner) %>%
group_by(owner, key, value) %>%
tally %>%
spread(value, n, fill = 0)
Which gives output
Source: local data frame [4 x 4]
Groups: owner, key [4]
owner key loud quiet
* <dbl> <chr> <dbl> <dbl>
1 0 obs1 1 1
2 0 obs2 2 0
3 1 obs1 1 1
4 1 obs2 0 2
In 2019 the answer is:
gather(df, key, value, -owner) %>%
count(owner, key, value) %>%
spread(value, n, fill = 0)