使用dplyr按截面单元生成crmrte与其他变量相关系数向量遇错及代码验证
嘿,我来帮你搞定这个分组计算相关系数的问题~
首先,你遇到的「因变量需为数值型」报错,核心原因应该是你用names(crime)[4:ncol(crime)]选中的变量里混进了非数值类型(比如字符、因子)的变量,而cor()函数只能处理数值数据,所以触发了报错。
其次,你想泛化计算crmrte和其他所有解释变量相关系数的思路是完全正确的,但可以优化得更稳健——毕竟按列位置选变量(比如第4列开始)很容易因为数据结构变动出问题,而且新版dplyr已经不推荐用summarise_at这类函数了,更推荐用across()来实现批量变量操作。
给你一个改进后的靠谱写法:
# 新版dplyr(1.0.0及以上版本适用) cors <- crime %>% group_by(county) %>% summarise( # 筛选所有数值型变量,排除crmrte本身 across(where(is.numeric) & !matches("crmrte"), # 计算crmrte和当前变量的相关系数,同时处理缺失值 ~ cor(crmrte, ., use = "complete.obs")) )
几个关键细节说明:
where(is.numeric):精准筛选数据框里的所有数值型变量,彻底避免非数值变量导致的报错;!matches("crmrte"):排除crmrte自身,避免计算和自己的相关系数(结果肯定是1,没意义);use = "complete.obs":如果你的数据里有缺失值,这个参数会自动剔除包含NA的行再计算相关系数,防止返回NA或者报错;across():是dplyr现在主推的批量处理函数,比旧的_at/_all/_if系列更灵活易读。
验证结果是否正确的小技巧:
你可以随便挑一个县的数据手动计算相关系数,和结果对比:
# 取第一个县的数据 test_county <- crime %>% filter(county == first(county)) # 手动计算crmrte和prbarr的相关系数 cor(test_county$crmrte, test_county$prbarr, use = "complete.obs") # 对比cors里对应行的prbarr列值,应该是一致的
这样处理后,你就能得到一个以county为分组,每行对应一个县,每列是crmrte和对应解释变量的相关系数的数据框啦。
内容的提问来源于stack exchange,提问作者Petr
相关产品推荐
相关产品推荐

