Группируйте данные в одном столбце на основе строкового значения в другом столбце, используя dplyr - PullRequest
0 голосов
/ 29 сентября 2019

У меня есть данные ниже в электронной таблице, где перечислены задачи, назначенные для студентов.

df <- data.frame(
Student=c("A","A","A","A","B","B","B","C","D","D","D","D"),
Task=c("Homework","Classwork","Assignment","Poster","Poster","Homework","Assignment","Homework","Classwork","Homework","Assignment","Poster"),
Status=c("Completed","Pending","Not performed","Not performed","Completed","Not performed","Not performed","Completed","Completed","Pending","Pending","Pending"), 
stringsAsFactors = FALSE)

Я хотел бы сгруппировать данные на уровне задач и найти количество для каждой задачи на основе 'Статус «Завершено».Ниже приведен мой ожидаемый результат

Output

Я использовал приведенный ниже фрагмент, но, похоже, он не работает.Приветствуется любая помощь.

df %>% group_by(Task)  %>% 
         summarize(
             Count = nrow(df[df$Status == 'Completed',])
         ) 

Редактировать: Обновлен вопрос о добавлении фактического набора данных вместо снимка экрана.

Ответы [ 2 ]

3 голосов
/ 29 сентября 2019

Вы можете отфильтровать данные на основе столбца, а затем выполнить подсчет для задачи:

df <- data.frame(
  student = c(
    rep("A", 4), rep("B", 4), rep("C", 4), rep("D", 4)
  ), 
  task = rep(
    c("Home", "Class", "Assign", "Poster"), 4
  ), 
  res = sample(
    c("Completed", "Pending", "Not performed"), 
    16, TRUE
  )
) 

library(dplyr)
#> 
#> Attaching package: 'dplyr'
#> The following objects are masked from 'package:stats':
#> 
#>     filter, lag
#> The following objects are masked from 'package:base':
#> 
#>     intersect, setdiff, setequal, union
df %>% 
  filter(res == "Completed") %>%
  count(task)
#> # A tibble: 4 x 2
#>   task       n
#>   <fct>  <int>
#> 1 Assign     1
#> 2 Class      1
#> 3 Home       1
#> 4 Poster     3

Создано в 2019-09-29 пакетом Представить (v0.3.0)

2 голосов
/ 29 сентября 2019

Используя набор данных @ Colin вместе с map_df и spread, мы можем предоставить более эффективное решение.

library(dplyr)
df %>% 
   split(.$task) %>% 
   purrr::map_df(.%>%count(res), .id='task') %>% 
   tidyr::spread(res, n, fill = 0)

# A tibble: 4 x 4
  task   Completed `Not performed` Pending
  <chr>      <dbl>           <dbl>   <dbl>
1 Assign         3               1       0
2 Class          3               0       1
3 Home           1               1       2
4 Poster         3               0       1

Короткий и приятный ответ от @ Jaap

df %>% count(task, res) %>% spread(res, n, fill = 0)

PS: Набор данных в формате копирования-вставки "не как изображение" облегчит другим помощь вам.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...