如何通过R中的多列计算逻辑值?

如何通过R中的多列计算逻辑值?,r,dplyr,R,Dplyr,我的目标是统计每个人(变量=名称)完成的任务总数。一个人每天只能完成一项任务 我的数据集如下所示: name task1 task2 task3 day bill TRUE FALSE FALSE 1 bill FALSE TRUE FALSE 2 bill FALSE FALSE FALSE 3 bill NA NA NA 4 alex FALSE FALSE FALSE 1 alex TRUE FALSE FALSE 2 alex FALS

我的目标是统计每个人(变量=名称)完成的任务总数。一个人每天只能完成一项任务

我的数据集如下所示:

name  task1 task2 task3 day
bill  TRUE  FALSE FALSE  1
bill  FALSE TRUE  FALSE  2
bill  FALSE FALSE FALSE  3
bill  NA    NA    NA     4
alex  FALSE FALSE FALSE  1
alex  TRUE  FALSE FALSE  2
alex  FALSE FALSE FALSE  3
alex  NA    NA     NA    4
rob   TRUE  FALSE FALSE  1
rob   TRUE  FALSE FALSE  2
rob   TRUE  FALSE FALSE  3
rob   NA    NA    NA     4
这是我需要的输出:

name  total
bill   2
alex   1    
rob    3
我的代码:(如您所见,我可以总结任务的数量,但输出与我需要的仍然相去甚远)

total%
分组人(`name`)%>%
总结(task1\u processed=sum(task11,na.rm=TRUE),task2\u processed=sum(task2,na.rm=TRUE),
task3_processed=sum(task3,na.rm=TRUE))
一个选项可以是:

df %>%
    group_by(name) %>%
    summarise(n = sum(unlist(across(starts_with("task"))), na.rm = TRUE))

  name      n
* <chr> <int>
1 alex      1
2 bill      2
3 rob       3

对于每个
名称
,您可以
任务
列相加

library(dplyr)
df %>%
  group_by(name) %>%
  summarise(total = sum(unlist(select(cur_data(), starts_with('task'))), na.rm = TRUE))

#   name  total
#* <chr> <int>
#1 alex      1
#2 bill      2
#3 rob       3
库(dplyr)
df%>%
分组单位(名称)%>%
总结(总计=总和(未列出(选择(cur_data(),以('task'))开头),na.rm=TRUE))
#姓名总数
#*  
#亚历克斯1
#2条例草案2
#3抢3

您可以在所有列中使用
c\u来
sum
逻辑值:

library(dplyr)

df %>% group_by(name) %>% 
       summarize(total = sum(c_across(where(is.logical)), na.rm = TRUE)) %>%
       ungroup

  name  total
  <chr> <int>
1 alex      1
2 bill      2
3 rob       3
库(dplyr)
df%%>%分组人(姓名)%%>%
汇总(总计=总和(c_跨(其中(is.logical)),na.rm=TRUE))%>%
解组
姓名总数
亚历克斯1
2条例草案2
3抢3

A
数据表
选项

setDT(df)[, .(total = sum(na.omit(unlist(.SD)))), name, .SDcols = patterns("^task")]
给予

library(dplyr)

df %>% group_by(name) %>% 
       summarize(total = sum(c_across(where(is.logical)), na.rm = TRUE)) %>%
       ungroup

  name  total
  <chr> <int>
1 alex      1
2 bill      2
3 rob       3
setDT(df)[, .(total = sum(na.omit(unlist(.SD)))), name, .SDcols = patterns("^task")]
   name total
1: bill     2
2: alex     1
3:  rob     3