使用dplyr根据另一列中的字符串值对一列中的数据进行分组

使用dplyr根据另一列中的字符串值对一列中的数据进行分组,r,dplyr,R,Dplyr,我在电子表格中有以下数据,其中列出了分配给学生的任务 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"),

我在电子表格中有以下数据,其中列出了分配给学生的任务

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)

编辑:更新问题以添加实际数据集而不是屏幕截图。

您可以根据列筛选数据,然后对任务进行计数:

df >正在附加包:“dplyr” >以下对象已从“package:stats”屏蔽: > >滤波器,滞后 >以下对象已从“package:base”屏蔽: > >相交、setdiff、setequal、并集 df%>% filterres==已完成%>% 计数任务 >一个tibble:4x2 >任务n > >1分配1 >2一级 >3家1 >4海报3
2019-09-29由v0.3.0创建,使用@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

PS:复制粘贴格式的数据集(而不是图像)将使其他人更容易帮助您

df%>%counttask,res%>%spreadres,n更容易/更有效imo@Jaap的确是这样,但我的头朝着一个方向走,鲁尔,更新了。谢谢,我明白了。更新了问题。请学习如何给出答案。这将使其他人更容易帮助你。我理解。更新了问题。
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
df %>% count(task, res) %>% spread(res, n, fill = 0)