R使用dplyr分组汇总因子列时default_flag返回NA的解决方法
问题原因
default_flag列是因子(factor)类型,即使它的水平取值为字符串形式的"0"和"1",R内置的mean()函数默认不支持对因子类型计算算术均值,因此会全部返回NA。pred_default本身是数值型列,所以均值计算正常。
解决方案
方法1:汇总时临时转换类型计算
计算均值前先将因子转为字符型,再转为数值型即可正常计算。
如果使用常规summarise写法:
library(dplyr) train %>% group_by(obs_m) %>% summarise( default_flag = mean(as.numeric(as.character(default_flag))), pred_default = mean(pred_default) )
如果要保留原来的summarise_at批量写法,可以统一对列做类型判断处理:
train %>% group_by(obs_m) %>% summarise_at( vars(default_flag, pred_default), ~ if (is.factor(.)) mean(as.numeric(as.character(.))) else mean(.) )
方法2:预处理阶段提前转换列类型
如果后续需要频繁对default_flag做数值运算,可以直接在数据清洗环节把该列转为数值型,后续汇总无需额外处理:
# 提前转换列类型 train <- train %>% mutate(default_flag = as.numeric(as.character(default_flag))) # 直接运行原代码即可得到正确结果 train %>% group_by(obs_m) %>% summarise_at(vars(default_flag, pred_default), mean)
注意:禁止直接对因子使用
as.numeric()转换,该操作会返回因子的内部水平编码,而非水平对应的实际值。以你的数据为例,default_flag的水平顺序为"0"是第1个水平、"1"是第2个水平,直接转数值会把所有"0"转为1、"1"转为2,最终计算出的均值完全错误,必须先转字符型再转数值型。
用你提供的示例数据运行上述代码,default_flag列会正确返回均值0,pred_default列返回对应数值均值,无NA值。
内容的提问来源于stack exchange,提问作者Saïd Maanan
相关产品推荐
相关产品推荐

