相关矩阵计算报错:删除NA值后仍无法运行的解决方法
R语言计算相关矩阵的问题解决
问题背景
我在R语言中尝试计算相关矩阵,数据集样例如下:
> head(matrix) # A tibble: 6 x 16 # Groups: nquest, nord [6] nquest nord sex anasc ireg eta staciv studio asnonoc2 nace2 nesplav etalav dislav acontrib occnow tpens <int> <int> <dbl> <int> <int> <int> <int> <fct> <int> <int> <fct> <fct> <fct> <int> <int> <int> 1 173 1 1 1948 18 72 3 2 2 19 1 2 0 35 2 1800 2 2886 1 1 1949 13 71 1 2 2 16 1 2 0 35 2 1211 3 2886 2 0 1952 13 68 1 3 2 17 1 2 0 42 2 2100 4 5416 1 0 1958 8 62 3 1 1 19 2 1 0 30 2 700 5 7886 1 1 1950 9 70 1 2 2 11 1 2 0 35 2 2000 6 20297 1 1 1960 5 60 1 1 1 19 2 1 0 39 2 1200
其中nquest和nord是家庭及家庭成员的标识编码,我用以下代码移除这两列:
matrix <- final %>% select("sex", "anasc", "ireg", "eta","staciv", "studio", "asnonoc2", "nace2", "nesplav", "etalav", "dislav", "acontrib", "occnow", "tpens")
dplyr提示:
Adding missing grouping variables: `nquest`, `nord`
不过我觉得这两列留着不影响。数据集中存在NA值:
> sum(is.na(matrix)) [1] 109
尝试过的方法及错误
- 方法1:直接用
cor()处理NA值
cor(matrix, use = "pairwise.complete.obs")
返回错误:
Error in cor(matrix, use = "pairwise.complete.obs") : 'x' must be numeric
- 方法2:先删除NA再计算
cor(na.omit(matrix))
返回同样错误:
Error in cor(na.omit(matrix)) : 'x' must be numeric
- 方法3:强制转换为数值型
matrix <- as.numeric(matrix)
返回错误:
Error: 'list' object cannot be coerced to type 'double'
问题原因
报错核心是数据集中存在因子(fct类型)列,从数据集输出里能看到studio、nesplav、etalav、dislav都是<fct>类型,而cor()函数只能处理数值型数据,直接传入包含因子的 tibble 就会报错。另外as.numeric(matrix)直接对整个 tibble 操作会失败,因为 tibble 本质是列表,不能直接转成单一数值向量。
解决步骤
步骤1:解除分组(可选但推荐)
原数据final是按nquest和nord分组的,移除分组列后dplyr会自动补充分组变量,先解除分组避免后续干扰:
final <- final %>% ungroup()
之后再选择需要的列:
matrix <- final %>% select(sex, anasc, ireg, eta, staciv, studio, asnonoc2, nace2, nesplav, etalav, dislav, acontrib, occnow, tpens)
步骤2:将因子列转换为数值型
可以选择自动识别转换所有因子列,或手动指定列转换:
# 方法1:自动转换所有因子列 matrix <- matrix %>% mutate(across(where(is.factor), as.numeric)) # 方法2:手动指定需要转换的列(适合部分因子无需转换的场景) matrix <- matrix %>% mutate(studio = as.numeric(studio), nesplav = as.numeric(nesplav), etalav = as.numeric(etalav), dislav = as.numeric(dislav))
注意:如果因子是有序分类变量,建议先转成有序因子再转数值,比如as.numeric(as.ordered(studio)),避免顺序错乱。
步骤3:计算相关矩阵
现在所有列都是数值型,即可用cor()处理NA值:
# 成对删除NA值计算相关系数(保留更多样本) cor_matrix <- cor(matrix, use = "pairwise.complete.obs") # 或者删除所有含NA的行后计算(样本量会减少) cor_matrix <- cor(na.omit(matrix))
验证转换结果
用str()查看数据类型,确认所有列都是数值型:
str(matrix)
内容的提问来源于stack exchange,提问作者io_boh
相关产品推荐
相关产品推荐

