You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在R中计算Likert量表数据不同类别间的Spearman相关矩阵

问题描述

我有一个包含两列的数据集:一列是Likert顺序量表的答案(因子类型),另一列是每个问题的类别。数据示例如下:

df
# A tibble: 50 × 2
   answers           Cat  
   <fct>             <chr>
 1 Very Satisfied    A    
 2 Satisfied         A    
 3 Very Satisfied    B    
 4 Average           B    
 5 Dissatisfied      C    
 6 Average           A    
 7 Very Satisfied    A    
 8 Very Satisfied    B    
 9 Satisfied         B    
10 Very Dissatisfied C    

数据集结构:

structure(list(answers = structure(c(5L, 1L, 4L, 5L, 4L, 2L, 
5L, 2L, 5L, 2L, 5L, 5L, 3L, 3L, 5L, 4L, 5L, 5L, 2L, 1L, 4L, 3L, 
4L, 2L, 5L, 5L, 5L, 5L, 3L, NA, 4L, 1L, 4L, 4L, 2L, 2L, 2L, 1L, 
4L, 3L, 5L, 2L, 1L, 3L, 1L, 5L, 1L, 1L, 4L, 3L, 4L, 2L, 5L, 3L, 
1L, 2L, 4L, 5L, 1L, NA), levels = c("Very Dissatisfied", "Dissatisfied", 
"Average", "Satisfied", "Very Satisfied"), class = "factor"), 
    Cat = c("A", "A", "B", "B", "C", "C", "A", "A", "B", "B", 
    "C", "C", "A", "A", "B", "B", "C", "C", "A", "A", "B", "B", 
    "C", "C", "A", "A", "B", "B", "C", "C", "A", "A", "B", "B", 
    "C", "C", "A", "A", "B", "B", "C", "C", "A", "A", "B", "B", 
    "C", "C", "A", "A", "B", "B", "C", "C", "A", "A", "B", "B", 
    "C", "C")), row.names = c(NA, -60L), class = c("tbl_df", 
"tbl", "data.frame"))

需要计算类别A、B、C之间的Spearman相关矩阵,结果为3×3矩阵且主对角线值为1。

解决方案

步骤1:将长格式数据转换为宽格式

原数据是长格式,每个类别(A/B/C)的答案分散在多行中。首先按观测组将数据转换为宽格式,让每一行对应一组A、B、C的答案:

library(dplyr)
library(tidyr)

# 创建分组标识:每6行(A,A,B,B,C,C)为一组
df <- df %>%
  mutate(group_id = rep(1:(nrow(.)/6), each=6)) %>%
  # 每个组内保留每个类别的第一个非NA答案
  group_by(group_id, Cat) %>%
  summarise(answers = first(na.omit(answers)), .groups = "drop") %>%
  # 转换为宽格式
  pivot_wider(names_from = Cat, values_from = answers)

步骤2:将因子转换为数值型

Likert因子的水平顺序已匹配量表逻辑,直接转换为数值即可:

df_num <- df %>%
  mutate(across(A:C, as.numeric)) %>%
  select(-group_id) # 移除分组标识列

步骤3:计算Spearman相关矩阵

使用cor()函数指定Spearman方法,同时处理缺失值:

spearman_cor <- cor(df_num, method = "spearman", use = "complete.obs")
print(spearman_cor)

运行后会得到一个3×3矩阵,主对角线值为1,其余为A与B、A与C、B与C之间的Spearman相关系数。


内容的提问来源于stack exchange,提问作者Homer Jay Simpson

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 01:53:14