'Can' t在通过分组汇总数据时创建对不可调用对象的错误调用

我有以下数据框:

df <- data.frame(NR_HH = c('HH1','HH1','HH1','HH1','HH2','HH2'), ID = c(11,12,13,14,21,22), Age = c(28,25,16,4,45,70), Fem_Adult = c('FALSE','TRUE','FALSE','FALSE', 'TRUE','TRUE'),Male_Adult = c('TRUE','FALSE','FALSE','FALSE', 'FALSE','FALSE'), School_Child = c('FALSE','FALSE','TRUE','FALSE', 'FALSE','FALSE'), Preschool_Child = c('FALSE','FALSE','FALSE','TRUE', 'FALSE','FALSE'))

#  NR_HH ID Age Fem_Adult Male_Adult School_Child Preschool_Child
#1   HH1 11  28     FALSE       TRUE        FALSE           FALSE
#2   HH1 12  25      TRUE      FALSE        FALSE           FALSE
#3   HH1 13  16     FALSE      FALSE         TRUE           FALSE
#4   HH1 14   4     FALSE      FALSE        FALSE            TRUE
#5   HH2 21  45      TRUE      FALSE        FALSE           FALSE
#6   HH2 22  70      TRUE      FALSE        FALSE           FALSE

我想通过NR_HH对这些数据进行分组,并 Build 一个新的数据框,显示每个家庭中的女性成年人,男性成年人,学龄儿童和学龄前儿童的数量 . 我想得到这样的东西:

#  NR_HH Fem_Adult Male_Adult School_Child Preschool_Child
#1   HH1         1          1            1               1
#2   HH2         2          0            0               0

我尝试了以下代码:

df_summary =df%>%group_by(NR_HH)%>%summarise_if(is.logical, sum)

但我得到这个错误:

Error: Can't create call to non-callable object

回答(1)

2 years ago

问题在于列类型 . 这些是通过引用 'TRUE'/'FALSE' 创建的 factor 列,其结果为 character 类型 . 但是,默认情况下 data.frame 调用使用 stringsAsFactors = TRUE . 因此,我们为这些列获取了 factor class . 只需取消选择 TRUE/FALSE 输入即可避免这种情况 . 假设输入已经被引用,然后使用 as.logical 将其转换为 logical ,然后在'NR_HH'分组后获取 sum

df %>%
   mutate_at(4:7, as.logical) %>% 
   group_by(NR_HH) %>% 
   summarise_if(is.logical, sum)
# A tibble: 2 x 5
#  NR_HH Fem_Adult Male_Adult School_Child Preschool_Child
#   <fct>     <int>      <int>        <int>           <int> 
# 1 HH1           1          1            1               1
# 2 HH2           2          0            0               0